C++ CMake没有将共享库的链接依赖项传播到我的可执行文件
我过去曾问过这个问题,但背景不同。我有一个C++应用程序(C++ CMake没有将共享库的链接依赖项传播到我的可执行文件,c++,cmake,static-libraries,linker-errors,static-members,C++,Cmake,Static Libraries,Linker Errors,Static Members,我过去曾问过这个问题,但背景不同。我有一个C++应用程序(App),它链接到一个静态C++库A( LIBA ),它链接到一个静态C库B( LBB < /代码>): 问题是,当我构建App时,我得到一个链接器错误:“错误:未定义对mpfit的引用”mpfit是libB中的一个函数。现在有一件奇怪的事: 如果我将LibA共享(通过在CMake中将STATIC替换为shared),我不会得到链接器错误 有人告诉我,我必须将所有共享库链接到我自己的App。我试过了,它确实起了作用。但我现在的问题是:
App
时,我得到一个链接器错误:“错误:未定义对mpfit的引用”
mpfit
是libB
中的一个函数。现在有一件奇怪的事:
- 如果我将
共享(通过在CMake中将LibA
替换为STATIC
),我不会得到链接器错误李>shared
App
。我试过了,它确实起了作用。但我现在的问题是:
- CMake不是应该自动将所有链接依赖项传播到我的可执行文件吗?这不是
函数中的target\u link\u libraries
关键字的用途吗PUBLIC
- 当
是共享库时,为什么没有链接器错误LibA
libA.cpp.o:
// ... blah blah ...
U mpfit
// ... blah blah ...
链接
libB
到libA
时,链接器很可能正在删除未引用的符号。这意味着当您链接到App
时,一些libB
符号丢失
在这种情况下,您可能需要指定链接器选项,以便在第一次链接期间保持整个
libB
。例如,对于gcc,您是否有错误:对libB
中符号的未定义引用,由libA
@UmNyobe使用是的,如果我们讨论的是例如GNU工具链,您可以使用它来查看实际调用的内容(例如,在Windows平台上,其中有)。一般来说,STATIC
和SHARED
之间的区别在于,SHARED
LibA实际上有LibB链接到它
libA.cpp.o:
// ... blah blah ...
U mpfit
// ... blah blah ...