C++ CMake没有将共享库的链接依赖项传播到我的可执行文件

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。我试过了,它确实起了作用。但我现在的问题是:

我过去曾问过这个问题,但背景不同。我有一个C++应用程序(App),它链接到一个静态C++库A(<代码> LIBA ),它链接到一个静态C库B(<代码> LBB < /代码>):

问题是,当我构建
App
时,我得到一个链接器错误:
“错误:未定义对mpfit的引用”
mpfit
libB
中的一个函数。现在有一件奇怪的事:

  • 如果我将
    LibA
    共享(通过在CMake中将
    STATIC
    替换为
    shared
    ),我不会得到链接器错误
有人告诉我,我必须将所有共享库链接到我自己的
App
。我试过了,它确实起了作用。但我现在的问题是:

  • CMake不是应该自动将所有链接依赖项传播到我的可执行文件吗?这不是
    target\u link\u libraries
    函数中的
    PUBLIC
    关键字的用途吗
  • LibA
    是共享库时,为什么没有链接器错误
编辑1:

如果有帮助:如果我做了nm 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 ...