【发布时间】:2016-06-23 14:26:07
【问题描述】:
我过去曾问过这个问题,但在不同的背景下。我有一个 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 中将STATIC替换为SHARED)我不会收到链接器错误!
有人告诉我,我必须自己将所有共享库链接到App。我试过了,它确实有效。但这是我现在的问题:
- CMake 不应该自动将所有链接依赖项传播到我的可执行文件吗?这不就是
target_link_libraries函数中PUBLIC关键字的用途吗? - 当
LibA是共享库时,为什么我没有收到链接器错误?
编辑1:
如果有帮助:如果我这样做 nm libA 我会得到:
libA.cpp.o:
// ... blah blah ...
U mpfit
// ... blah blah ...
【问题讨论】:
-
你有来自
libBlibA使用的error: undefined reference to符号 -
@UmNyobe 是的,完全正确
-
如果我们在谈论例如GNU 工具链,您可以使用 verbose output 查看实际调用的内容(例如,在 Windows 平台上,其中有 weird workarounds)。一般来说,
STATIC和SHARED之间的区别在于,SHAREDLibA 确实有 LibB 链接到它。
标签: c++ cmake static-libraries linker-errors static-members