链接静态库:-llibrary或liblibrary.a?

时间:2014-09-17 14:00:30

标签: c++ gcc ld

我真的很困惑,这里我认为是我情况的简化模型:

libMyLibrary2.a引用了libMyLibrary1.a。如果我像这样链接:

gcc -shared dummy.cpp.o -o libOutput.so -L/path/to/libs -lMyLibrary1 -lMyLibrary2

我收到了大量undefined reference to错误。但如果我像这样链接:

gcc -shared dummy.cpp.o -o libOutput.so -L/path/to/libs -lMyLibrary1 /path/to/libs/libMyLibrary2.a

一切都没问题。这是正常的吗?或者它应该与我的具体设置有关?实际上,我有许多库来代替MyLibrary1和MyLibrary2以及许多标志。或者是我错过了其他的东西,也许是命令之间的一些关键区别?我可以发布确实的命令,如果需要,可以执行和不工作。

1 个答案:

答案 0 :(得分:2)

您需要告诉链接器链接整个存档文件:

gcc -shared dummy.cpp.o -o libOutput.so -L/path/to/libs -Wl,-whole-archive -lMyLibrary1.a -lMyLibrary2.a -Wl,-no-whole-archive

由于静态库没有依赖关系,您需要告诉链接器创建一个包含两组对象的新静态库。

您的第二种情况(工作正常)具有所需的效果,因为您将静态库直接传递给编译器。

在第一种情况下,链接器将从虚拟对象引用的library1和library2中获取对象。