Cmake不会将共享库的链接依赖关系传播到我的可执行文件
CMake is not propagating link dependencies of shared libraries to my executable
我过去曾问了这个问题,但在不同的情况下。我有一个C 应用程序(App
),该应用程序链接到静态C 库A(libA
),该应用程序链接到静态C库B(libB
):
# App CMakeLists.txt
add_executable(App ${APP_HEADER_FILES} ${APP_SOURCE_FILES})
target_link_libraries(App PUBLIC LibA)
# LibA CMakeLists.txt
add_library(LibA STATIC ${LIBA_HEADER_FILES} ${LIBA_SOURCE_FILES})
target_link_libraries(LibA PUBLIC LibB)
问题是,当我构建App
时,我会收到一个链接器错误:"error: undefined reference to mpfit"
。mpfit
是libB
中的功能。这是奇怪的事情:
- 如果我共享
LibA
(通过CMAKE中的SHARED
替换STATIC
)我没有链接器错误!
有人告诉我,我必须自己将所有共享库链接到App
。我尝试了,它实际上奏效了。但这是我现在的问题:
- cmake不应该自动传播到我的可执行文件的所有链接依赖关系?这不是
target_link_libraries
函数中PUBLIC
关键字的目的吗? - 当
LibA
是共享库时,为什么我没有链接错误?
edit1:
如果有帮助:如果我做nm libA
,我会得到:
libA.cpp.o:
// ... blah blah ...
U mpfit
// ... blah blah ...
在将libB
链接到libA
时,链接器很可能会删除非引用符号。这意味着,当您链接到App
时, libB
的某些符号已丢失。
在这种情况下,您可能需要指定链接器选项,以在第一个链接期间保留整个libB
。例如,对于GCC,您拥有 - 全仓LD参数
相关文章:
- C++GTKMM gui循环依赖关系
- 如何在头文件中声明类模板(由于循环依赖关系)
- 对在不同二进制文件中创建的对象文件的依赖关系
- 使用Bazel构建具有不同编译器/链接器选项的C/C++依赖关系
- OpenVINO - 推理库插件 libMKLDNNPlugin.so 无法解析依赖关系
- 模拟测试中类的依赖关系
- C++模板方法中的循环依赖关系
- 解析正交模块的依赖关系
- 如何在 Mac OS 上安装 boost-mpi 及其对 clang 的依赖关系?
- Wt::D bo 中的循环依赖关系
- 在包含窗口标头时难以解决循环依赖关系问题
- 当依赖关系和依赖关系都是多态时,在哪个继承级别存储依赖关系指针?
- 解决循环依赖关系 c++ 的想法
- C++循环依赖关系,未声明的标识符
- C++ 中的循环依赖关系问题
- 为什么包含需要进一步的依赖关系?
- 使用 cmake 获取外部依赖关系
- CMake 外部和内部静态库的循环依赖关系
- 在没有Xcode的macOS中开发具有依赖关系的应用程序
- "std::shared_ptr"循环依赖关系是如何导致问题的