Ich denke, das Problem ist, dass opt
bereits seine eigenen Argumente analysiert, und hat bereits die Bitcode-Datei als Positionsargument zu verarbeiten, so dass mehr als eine Positionsargumente Ambiguität schafft.
Die Dokumentation erläutert die API so, als ob sie in einer eigenständigen Anwendung verwendet wird. So zum Beispiel, wenn Sie so etwas tun:
int main(int argc, char *argv[]) {
cl::list<std::string> Files(cl::Positional, cl::OneOrMore);
cl::list<std::string> Files2(cl::Positional, cl::OneOrMore);
cl::list<std::string> Libraries("l", cl::ZeroOrMore);
cl::ParseCommandLineOptions(argc, argv);
for(auto &e : Libraries) outs() << e << "\n";
outs() << "....\n";
for(auto &e : Files) outs() << e << "\n";
outs() << "....\n";
for(auto &e : Files2) outs() << e << "\n";
outs() << "....\n";
}
Sie so etwas wie dieses:
$ foo -l one two three four five six
one
....
two
three
four
five
....
six
....
Nun, wenn Sie sich um die beiden Positions Argument Definitionen tauschen oder sogar die cl::OneOrMore
von ändern Files2
Option cl::ZeroOrMore
, erhalten Sie einen Fehler
$ option: error - option can never match, because another positional argument will match an unbounded number of values, and this option does not require a value!
persönlich bekommen, wenn ich opt
verwenden verzichten wir die positiontal arg UMENT Option und etwas tun, wie folgt aus:
cl::list<std::string> Lists("lists", cl::desc("Specify names"), cl::OneOrMore);
, die mich, dies zu tun erlaubt:
opt -load ./fooPass.so -foo -o out.bc -lists one ./in.bc -lists two
und Iterieren über die std::string
Liste die gleiche Art und Weise erhalte ich:
one
two
Das S-Flag ist keine Option für den Pass, es ist eine Option, sich selbst zu aktivieren, so dass es die LLVM-Assembly ausgibt. – Shuzheng
Wie kann ich die erste Arbeit (Positional) machen? – Shuzheng
Können Sie die Option '-mapiWM' erklären? – hailinzeng