共享库中静态库中现有函数的符号查找错误

问题描述 投票:0回答:1

我有一个静态库“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)
c++11 cmake shared-libraries static-libraries
1个回答
0
投票
$ 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
的定义。

© www.soinside.com 2019 - 2024. All rights reserved.