c++ - 如何使用 ExternalProject_Add 静态链接到 NATS C 库
问题描述
我正在尝试将 NATS C 客户端作为对我的项目的依赖项。我更喜欢静态链接,因为我的项目非常小并且作为独立服务运行,因此发布一个可执行文件更方便。
ExternalProject_Add
似乎最有希望与各种构建系统兼容。但是在使用这种方法构建时出现链接错误:
3rd_party/nats/build/src/libnats_static.a(mutex.c.o): In function `natsMutex_Create':
mutex.c:(.text+0x36): undefined reference to `pthread_mutexattr_init'
mutex.c:(.text+0x4b): undefined reference to `pthread_mutexattr_settype'
mutex.c:(.text+0xc0): undefined reference to `pthread_mutexattr_destroy'
mutex.c:(.text+0x19d): undefined reference to `pthread_mutexattr_destroy'
3rd_party/nats/build/src/libnats_static.a(mutex.c.o): In function `natsMutex_TryLock':
mutex.c:(.text+0x1b5): undefined reference to `pthread_mutex_trylock'
...
奇怪的是,当我将链接方法从静态更改为共享时,构建成功并且程序按预期工作。相关代码包含在CMakeLists.txt
.
可以通过以下方式获取产生上述错误的源代码git clone https://github.com/onichandame/nats-epics.git --branch question --depth 1
开发环境是CentOS 8,我为这个环境做了一个docker镜像onichandame/docker-dev
解决方案
当您将其与静态 NATS 库链接时,您还需要链接到 NATS 库的依赖项。在这种情况下,它看起来可能只是 pthread 库。CMake 有一种很酷的方式链接到 pthread 库(对于 CMake 3.1.0 或更高版本):
set(THREADS_PREFER_PTHREAD_FLAG ON)
find_package(Threads REQUIRED)
add_executable(myexe ${SourceFiles})
target_link_libraries(myexe PRIVATE Threads::Threads)
对于 CMake 版本 2.8.12 或更高版本,您可以这样做:
find_package(Threads REQUIRED)
add_executable(myexe2 ${SourceFiles})
target_link_libraries(myexe2 PRIVATE ${CMAKE_THREAD_LIBS_INIT})
推荐阅读
- javascript - TypeError:无法读取未定义的属性“uid”
- python - 即使环境已设置,也会出现 DefaultCredentialsError
- mysql - Trgigger 内的 MySQL 删除表
- c++ - Unique_Ptrs 语法 {}
- c# - Entity Framework Core 2 中的导航属性
- laravel - 如何在 Test:suite 之前调用工匠命令
- java - 如何在junit4 Java中测试多行代码是否抛出异常
- c++ - 在 Jenkins 中运行 make 命令
- javascript - React Native 函数绑定参数
- jquery - 如何在 React 中使用“draggable()”函数?