与CMake链接的C ++动态和静态库

时间:2014-04-04 09:49:18

标签: c++ cmake antlr ld

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

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

cmd> g++ program.cpp -lmylib

我得到了

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

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

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)第二个错误是什么意思?为什么不能找到libgcc_s?

我真的很感激任何帮助。

修改

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

1 个答案:

答案 0 :(得分:1)

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