【问题标题】:C++ dynamic and static libraries linking with CMake与 CMake 链接的 C++ 动态和静态库
【发布时间】:2014-04-04 09:49:18
【问题描述】:

我需要 C++ 编译方面的帮助,因为我显然遗漏了一些东西。

我根据我编写的其他 .so 库 (mylib2) 和一些使用它的简单程序创建了 .so 库(我们称之为 mylib)。第二个库也依赖于ANTLR。我使用CMake 来构建两个库,它们的编译和安装都很好。但是当我尝试编译程序时:

cmd> g++ program.cpp -lmylib

我明白了

/usr/local/lib/libmylib2.so.0: undefined reference to `antlr::CharScanner::traceOut(char const*)'

ANTLR 似乎是静态库,所以我尝试了

cmd> g++ program.cpp -lmylib -Wl,-Bstatic -lantlr

但我得到的只是

/usr/bin/ld: cannot find -lgcc_s

我有两个问题:

1) 为什么mylib2 看不到antlr?我应该提一下,我使用自己的 cmake find 脚本,这会是一个问题吗?

find_package(ANTLR REQUIRED)
include_directories(${ANTLR_INCLUDE_DIR})

2) 第二个错误是什么意思?为什么ld找不到libgcc_s?

我将非常感谢任何帮助。

编辑

我应该提到我正在使用 ANTLR 2.7

【问题讨论】:

    标签: c++ cmake antlr ld


    【解决方案1】:

    来自man ld(GNU ld):-Bstatic - 不要链接到共享库。您可以在命令行上多次使用此选项:它会影响库搜索后面的 -l 选项。所以你应该在-lantlr 之后手动启用使用动态库。请记住,使用-fPIC 选项链接未编译的静态库可能会导致不可重定位代码和更长的应用程序启动时间http://www.airs.com/blog/archives/41

    【讨论】:

    • 感谢您的快速回复 :) 但是当我输入 g++ test.cpp -lmylib -Wl,-Bstatic -lantlr -Wl,-Bdynamic 我仍然得到“未定义的引用”错误。另外,有没有办法在 mylib2 中包含 antlr,这样我就不需要在每个使用 mylib 的程序中指定它?
    • 好吧,大致来说,Linux (ELF) 中的共享库与其他 ELF 二进制文件几乎没有区别,所以,是的,您可以像这样编译它:gcc -shared -o libmylib2.so mylib2_obj1.o mylib2_obj2.o /path/to/libantlr.a... 但实际上我如果系统中存在 libantlr 的动态版本,它将链接到它。
    猜你喜欢
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-04
    • 2013-03-09
    • 2010-09-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多