【问题标题】:Linker errors when linking a built libevent as a static library, but works when linking as a shared library将构建的 libevent 链接为静态库时出现链接器错误,但在作为共享库链接时有效
【发布时间】:2021-02-08 19:22:10
【问题描述】:

我已经使用 GCC 编译器(在 linux 上)从源代码构建了 libevent 库作为静态库。 Cmake 选项:

cmake -B build -S . -DEVENT__DISABLE_OPENSSL=ON -DEVENT__LIBRARY_TYPE=STATIC -DEVENT__DISABLE_DEBUG_MODE=ON  
cmake --build build --config Release

CMakeLists.txt 中的链接库:

target_link_libraries(${PROJECT_NAME}

        ${CMAKE_SOURCE_DIR}/libevent_core.a

        )

但我仍然收到这样的错误:

/usr/bin/ld: /home/user/libevent_test/main.cpp:65: undefined reference to `event_base_new'
/usr/bin/ld: /home/user/libevent_test/main.cpp:85: undefined reference to `event_new'
/usr/bin/ld: /home/user/libevent_test/main.cpp:89: undefined reference to `event_add'

我还尝试将 libevent 构建为共享库(.so 输出文件)并且链接良好。 在 CMakeLists.txt 中,我刚刚将 ${CMAKE_SOURCE_DIR}/libevent_core.a 更改为 ${CMAKE_SOURCE_DIR}/libevent_core.so
我的程序编译好了。为什么静态库不链接? 我做错了什么?
提前致谢!

【问题讨论】:

  • 除了${CMAKE_SOURCE_DIR}/libevent_core.a 库之外,您还需要链接它所依赖的库。与 shared 库不同,static 库不包含其依赖项列表。
  • 使用nm 列出库中定义的符号。
  • @Tsyvarev,我尝试链接 libevent.a、libevent_core.a、libevent_extra.a 和 libevent_pthreads.a。没有结果。 @stark,我检查了我所有的静态库,实际上,没有一个包含 event_new 函数。有点奇怪。但包含 event_add 也是未定义的引用。我可以在库中发布符号列表。做吗?
  • @stark,我弄错了,event_new 在 libevent_core.a 中也有。所有未定义引用的函数都在库中定义。
  • 我看了一眼CMakeLists.txt 文件,看起来该文件提供了install/export,所以您应该能够将lib 安装到您的目录中选择:cmake -B build -S . ... -D CMAKE_PREFIX=<path to install to> 并在构建 lib 之后 cmake --install build 在这种情况下,您应该能够使用 find_package(LIBEVENT libevent REQUIRED PATHS <path to ...config.cmake> NO_PACKAGE_ROOT_PATH NO_CMAKE_PATH NO_CMAKE_ENVIRONMENT_PATH) 来定位包;路径取决于 libevent 放置导入脚本的确切位置(命名为 libevent-config.cmake 或类似名称)

标签: c++ cmake linker static-libraries libevent


【解决方案1】:

解决了。我将target_link_libraries 用于可执行文件,但libevent 用于链接到可执行文件的静态库中。 现在我将 libevent 直接链接到正在使用它的静态库。它有效。

【讨论】:

    猜你喜欢
    • 2018-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-27
    • 1970-01-01
    • 2019-05-26
    相关资源
    最近更新 更多