如何使用 ExternalProject_Add 静态 link 到 NATS C 库

How to statically link to NATS C library using ExternalProject_Add

我正在尝试将 NATS C 客户端作为我项目的依赖项。我更喜欢静态地 link,因为我的项目很小并且作为独立服务工作,因此传送一个可执行文件更方便。

ExternalProject_Add 似乎是最有前途的,因为它与各种构建系统兼容。但是在使用这种方法构建时出现 link 错误:

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'
...

奇怪的是,当我将 link 方法从静态更改为共享时,构建成功并且程序按预期运行。相关代码包含在CMakeLists.txt.

产生上述错误的源代码可以通过git clone https://github.com/onichandame/nats-epics.git --branch question --depth 1

获取

开发环境为CentOS 8,我为这个环境做了一个docker镜像onichandame/docker-dev

当您使用静态 NATS 库 link 时,您还需要 link NATS 库的依赖项。在这种情况下,看起来它可能只是 pthread 库。 CMake 有一种很酷的方式 linking 到 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})