我真的很困惑,这里我认为是我情况的简化模型:
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以及许多标志。或者是我错过了其他的东西,也许是命令之间的一些关键区别?我可以发布确实的命令,如果需要,可以执行和不工作。
答案 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中获取对象。