【问题标题】:g++ linking static and non-static libraries at the same timeg ++同时链接静态和非静态库
【发布时间】:2014-09-09 12:01:03
【问题描述】:

我有一个 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 版本中用于链接的共享库”。

如何才能静态链接一些库而动态链接其他库?

提前致谢

附:我检查了一些类似的主题,并尝试了一些对我不起作用的方法。

【问题讨论】:

    标签: c++ makefile g++ static-linking dynamic-linking


    【解决方案1】:

    使用-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 $@

    【讨论】:

    • 抱歉忘记放在这里了。现在已经更正了。
    • 你的编译器命令中还有一个-Bdynamic
    【解决方案2】:

    您可以使用-Bstatic 静态链接后面的内容,然后使用-Bdynamic 做相反的事情。在命令行上任意多次。

    【讨论】:

    • 感谢您的回答。我以前尝试过,但没有成功。现在它给出了来自 boost 库的错误,即:“加载共享库时出错:libboost_filesystem.so.1.54.0:无法打开共享对象文件:没有这样的文件或目录”在不存在 boost 库的系统中。当我使用 -static 标志时,我可以在不需要安装 boost 库的情况下运行我的程序,但随后我得到了上面的另一个错误。
    • 当您构建您刚刚描述为失败的那个时,完整的链接行是什么?
    • "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 $@"
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-11
    • 2019-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多