【问题标题】:After generating libraries throws library.so: undefined symbol生成库后抛出 library.so: undefined symbol
【发布时间】:2013-12-15 03:06:31
【问题描述】:

我有一个 .cpp 文件,其中包含来自两个子目录(子文件夹 linoise 和 noiseutils)的文件。 我正在尝试将 c++ 类公开给 python(我尝试了 World 示例,但是当我尝试这个更复杂的任务时,我得到了错误)。我正在使用 CMakeLists.txt 来编译和创建 .so 文件。 它工作正常,它创建了三个 .so 库(一个在工作目录中,一个在 noiseutils 中,一个在 libnoise 中)。

当我尝试时

import map

它得到错误map.so: undefined symbol: _ZTIN5noise6module6ModuleE

project (map)
cmake_minimum_required(VERSION 2.8)

find_package(PythonLibs)
include_directories (${PYTHON_INCLUDE_DIRS})

find_package(Boost 1.45.0 COMPONENTS python)
include_directories (${Boost_INCLUDE_DIRS})
set (LIBNOISE_PATH ${MY_SOURCE_DIR}/libnoise)
set (LIBNOISEUTILS_PATH ${MY_SOURCE_DIR}/noiseutils)


add_subdirectory(libnoise)
add_subdirectory(noiseutils)

add_library (
    map SHARED  
    Wrapped.cpp
)



target_link_libraries (
    map
    boost_python
    ${PYTHON_LIBRARIES}
    ${Boost_LIBRARIES}
)

我需要以某种方式连接所有三个 .so 库还是它已经在工作目录的一个文件中? (它生成Make文件,编译并生成.so文件,我试图从名称中删除lib以与包装文件中的相同但它仍然抛出错误)

【问题讨论】:

标签: c++ python cmake boost-python


【解决方案1】:

您是否更新了 /etc 中的配置文件并运行了 ldconfig?可能是您的程序不知道“so”文件的位置。无论哪种方式,您至少必须在创建新的“so”文件后运行 ldconfig,以便操作系统知道新的“so”文件。

【讨论】:

    【解决方案2】:

    看起来您的“地图”库依赖于库 libnoise 和 noiseutils 中的内容,但您没有告诉链接器存在依赖关系。将这些库目标的名称添加到 target_link_libraries 指令:

    target_link_libraries (
        map
        libnoise
        noiseutils
        boost_python
        ${PYTHON_LIBRARIES}
        ${Boost_LIBRARIES}
    )
    

    注意,我不知道实际名称是什么。在这些子项目中使用与您在ADD_LIBRARY 中使用的名称相同的名称。

    使用ldd libmap.so(或任何名称)检查前后的结果:它将显示所有 .so 依赖项,在此修复之后,它应该显示 libnoise/noiseutils。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-09-23
      • 2020-09-05
      • 1970-01-01
      • 1970-01-01
      • 2023-01-29
      • 1970-01-01
      • 2022-01-04
      • 2021-09-16
      相关资源
      最近更新 更多