【发布时间】: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