我有一个静态库“import”,它提供了一个非成员函数 import_init(char*) 以及一个具有引用 import_init(char*) 的成员函数 Import(char*) 的类 ImportObject。
我可以使用静态库“导入”构建动态库“查看器”,但在运行时,我收到此错误:
./TestApplication: symbol lookup error: ./libViewer.so: undefined symbol: _Z17import_initPc
令我惊讶的是,我在编译时没有收到错误。而且看来该功能是可用的。在 nm 输出中,它一次显示为“在文本(代码)部分”,一次显示为“未定义”。我不明白函数名称后面的字母的确切含义以及它们为何不同。
$ nm -g libViewer.so | grep import_init
00000000001e1688 T _Z17import_initPKc
U _Z17import_initPc
我怀疑我的 CMake 配置出错了。
这是“导入”的 CMakeLists.txt 的简化版本:
cmake_minimum_required (VERSION 3.14)
include(FetchContent)
project (Import)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
...
add_library(Import STATIC)
target_include_directories(Import
PUBLIC
${CMAKE_CURRENT_SOURCE_DIR}/include
)
target_link_libraries(Import
...
)
target_link_options(Import
PRIVATE
$<$<PLATFORM_ID:Linux>:-Wl,--whole-archive>
${ADD_LINKER_OPTION}
)
add_subdirectory(src)
这是“查看器”的 CMakeLists.txt 的简化版本:
cmake_minimum_required (VERSION 3.14)
include(FetchContent)
project (Viewer)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
...
FetchContent_Declare(
Import
GIT_REPOSITORY git@URL:Import.git
GIT_TAG HEAD
GIT_SHALLOW TRUE
)
FetchContent_MakeAvailable(Import)
add_library(libViewer SHARED)
set_target_properties(libViewer PROPERTIES LIBRARY_OUTPUT_NAME Viewer)
target_include_directories(libViewer
PUBLIC
${CMAKE_CURRENT_SOURCE_DIR}/include
PRIVATE
${import_SOURCE_DIR}/include
)
target_link_libraries(libViewer
Import
...
)
add_subdirectory(src)
$ nm -g libViewer.so | grep import_init
00000000001e1688 T _Z17import_initPKc
U _Z17import_initPc
正如 Tsyvarev 在评论中已经提到的, nm 的输出显示,函数
import_init
是用参数 const char*
(_Z17import_initPKc
) 定义的,但用参数 char*
(_Z17import_initPc
) 声明的。
无法找到以
import_init
作为参数 (char*
) 的函数 _Z17import_initPc
的定义。