g++同时链接静态库和非静态库

6

我有一个makefile项目,其中包含几个不同的库。其中之一是boost库,我静态链接它以使我的程序具有可移植性。这是我的makefile命令的样子:

g++ -O0 -g test.cpp testObject.o -pthread -I/home/user/devel/lmx-sdk-4.7.1/include/ -L/home/user/devel/lmx-sdk-4.7.1/linux_x64 -llmxclient -lrt -ldl -lboost_filesystem  -lboost_system -static -static-libgcc -o $@

我已经将lmx-sdk库链接到我的项目中,以便使用许可功能; 然而,似乎lmx-sdk不喜欢静态链接,因为它会产生一个错误“在静态链接的应用程序中使用'dlopen'需要在运行时使用用于链接的glibc版本的共享库”。
我如何使一些库能够静态链接,另一些库能够动态链接?
提前感谢!
P.S. 我已检查了一些类似的主题,并尝试了一些方法,但对我来说并没有奏效。
2个回答

8

使用-Wl,-Bdynamic-Wl,-Bstatic代替仅使用-Bdynamic-Bstatic解决了问题。

完整的链接行现在看起来是这样的:

g++ -O0 -g test.cpp testObject.o -pthread -Bdynamic -I/home/user/devel/lmx-sdk-4.7.1/include/ -L/home/user/devel/lmx-sdk-4.7.1/linux_x64 -llmxclient -lrt -ldl -Wl,-Bstatic -lboost_filesystem -lboost_system -o $@


抱歉,我忘记在这里放它了。现在已经更正了。 - serhatg
你的编译器命令中仍然有“-Bdynamic”。 - Markus Dutschke

3
你可以使用-Bstatic静态链接其后的内容,然后使用-Bdynamic进行相反操作。在命令行上可以按需多次使用。

谢谢你的回答。我之前尝试过,但没有成功。现在出现了来自boost库的错误,错误信息是:“error while loading shared libraries: libboost_filesystem.so.1.54.0: cannot open shared object file: No such file or directory”,这是在一个不存在boost库的系统中发生的。当我使用-static标志时,我可以运行我的程序而不需要安装boost库,但是我会遇到上面提到的另一个错误。 - serhatg
你刚才描述的构建失败的链接行是什么? - John Zwinck
"g++ -O0 -g test.cpp testObject.o -pthread -Bdynamic -I/home/user/devel/lmx-sdk-4.7.1/include/ -L/home/user/devel/lmx-sdk-4.7.1/linux_x64 -llmxclient -lrt -ldl -Bstatic -lboost_filesystem -lboost_system -static-libgcc -o $@" 的翻译是: - serhatg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接