GCC命令行参数挑剔

GCC命令行参数挑剔,gcc,command-line,g++,command-line-arguments,Gcc,Command Line,G++,Command Line Arguments,GCC可能会对其接受参数的顺序非常挑剔: # Works. g++ Foo.cpp -L. -I. -lBar -o Foo # Linker errors. g++ -o Foo -I. -L. -lBar Foo.cpp 具体来说,命令行选项的订购要求是什么?库是根据它们所需的符号按需加载的,因此提供其他项所需符号的库必须遵循其他项。这是历史的,;可以说,现代系统应该自动解析符号,明智地处理循环(这就是该规则的原因;您可以通过按顺序指定库并根据需要多次指定来手动打破依赖循环),但g++遵

GCC可能会对其接受参数的顺序非常挑剔:

# Works.
g++ Foo.cpp -L. -I. -lBar -o Foo

# Linker errors.
g++ -o Foo -I. -L. -lBar Foo.cpp

具体来说,命令行选项的订购要求是什么?

库是根据它们所需的符号按需加载的,因此提供其他项所需符号的库必须遵循其他项。这是历史的,;可以说,现代系统应该自动解析符号,明智地处理循环(这就是该规则的原因;您可以通过按顺序指定库并根据需要多次指定来手动打破依赖循环),但
g++
遵循传统规则,因此它将与供应商
ld
s一起工作。(GNU
ld
不能在任何地方工作,因此不可能依靠它来解决符号依赖循环。即使在GNU
ld
确实工作的平台上,也存在引导问题。)类似地,其他面向链接器的选项必须按照它们影响的事物的正确顺序指定(例如,
-L
选项必须位于位于指定目录中的库之前;如果一个目录中的库与标准目录中同名的库有阴影,则这一点很重要).

引导问题?比如什么?如果
gcc
/
g++
依赖于特定于GNU
ld
的行为,那么您将陷入复杂的问题,即需要以什么样的顺序来构建GNU工具链才能运行。
gcc
/
g++
使用标准的供应商工具进行引导rposes,因为许多GNU程序依赖于
gcc
扩展,并且依赖于GNU
ld
——特定的行为将打破这一点。