我有两个使用LLVM command line来解析参数的静态库:
// lib1
void main(int argc, const char **argv) {
cl::opt<bool>LibOption1( ... ) // arg1
cl::ParseCommandLineOptions(argc, argv, "lib1\n");
}
// lib2
void main(int argc, const char **argv) {
// need to reset arguments list here ..
cl::opt<bool>LibOption2( ... ) // arg2
cl::ParseCommandLineOptions(argc, argv, "lib2\n"); // crash here!
}
该应用程序链接到两个这样的libs,如果在应用程序中只有1个lib并且在解析参数时崩溃,如果在应用程序中同时存在两个lib,则它们会解析参数。
似乎在// arg
参数的行中添加了一些参数的全局静态列表(?),这使得它们具有混合参数列表并相互影响。
在声明参数之前是否有机会重置该全局列表?
PS。我在CommandLine.cpp
找到了静态参数列表:
/// RegisteredOptionList - This is the list of the command line options that
/// have statically constructed themselves.
static Option *RegisteredOptionList = 0;
答案 0 :(得分:1)
void main
应该是什么? main
返回int
,无论如何,库都无法提供主要内容。如果这是在某个命名空间中,请不要写void main
。
全局列表应该是一个特性,因此每个库都可以提供自己的(不同命名空间的)参数。该库不本身应该调用cl::ParseCommandLineOptions
;只有真正的主要功能应该这样做。另外,在库中,cl::opt
作为局部变量没有意义,因为它只存在于该函数的持续时间内。 (如果您是应用程序,那么您可以安排在cl::ParseCommandLineOptions
到期之前调用cl::opt
。