LLVM CommandLine:如何重置参数?

时间:2014-09-27 18:53:24

标签: command-line llvm

我有两个使用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;

1 个答案:

答案 0 :(得分:1)

void main应该是什么? main返回int,无论如何,库都无法提供主要内容。如果这是在某个命名空间中,请不要写void main

全局列表应该是一个特性,因此每个库都可以提供自己的(不同命名空间的)参数。该库本身应该调用cl::ParseCommandLineOptions;只有真正的主要功能应该这样做。另外,在库中,cl::opt作为局部变量没有意义,因为它只存在于该函数的持续时间内。 (如果您是应用程序,那么您可以安排在cl::ParseCommandLineOptions到期之前调用cl::opt