5

我很想知道以以下两种方式将库(共享库和静态库)指定给 gcc/g++ 是否有任何实质性差异(CC 可以是 g++ 或 gcc)

CC -o output_executable /path/to/my/libstatic.a /path/to/my/libshared.so source1.cpp source2.cpp ... sourceN.cpp

对比

CC -o output_executable -L/path/to/my/libs -lstatic -lshared source1.cpp source2.cpp ... sourceN.cpp

我只能看到一个主要区别是直接传递完全指定的库名称可以更好地控制选择静态或动态版本,但我怀疑还有其他事情可能会对可执行文件的构建方式产生副作用或会在运行时表现,对吗?

安德里亚。

4

1 回答 1

5

好的,我可以根据一些实验和对 gcc 文档的深入阅读来回答自己:

来自 gcc 文档: http: //gcc.gnu.org/onlinedocs/gcc/Link-Options.html

[...]链接器通过扫描存档文件来处理存档文件,其中的成员定义了迄今为止已被引用但尚未定义的符号。但是如果找到的文件是一个普通的目标文件,它会以通常的方式链接。使用 -l 选项和指定文件名的唯一区别是 -l 用lib' and.a' 包围库并搜索多个目录

这实际上也回答了有关在 gcc 命令行上直接指定目标文件的第三个选项的相关疑问(即在这种情况下,目标文件中的所有代码都将成为最终可执行文件的一部分,而使用档案时,只有目标文件真正需要的将被拉入)。

于 2010-03-30T08:57:11.653 回答