如何使用 ExternalProject_Add 静态链接到 NATS C 库

Posted

技术标签:

【中文标题】如何使用 ExternalProject_Add 静态链接到 NATS C 库【英文标题】:How to statically link to NATS C library using ExternalProject_Add 【发布时间】:2020-06-19 03:55:20 【问题描述】:

我正在尝试将 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

【问题讨论】:

欢迎来到 SO。请注明tour 并阅读How to Ask 并发布minimal reproducible example。你不能指望社区会拉出你的整个仓库来帮助你解决这个问题。也就是说,根据您的帖子,您可能没有要链接的静态库。 欢迎来到 SO。请注明tour 并阅读How to Ask 并发布minimal reproducible example。你不能指望社区会拉出你的整个仓库来帮助你解决这个问题。也就是说,根据您的帖子,您可能没有要链接的静态库。 【参考方案1】:

当你将它与静态 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)

【讨论】:

谢谢!你的评论真的把我从泥潭里拖了出来!除了Thread lib,还需要OpenSSL 如果它解决了你的问题,你能把它标记为答案吗? 很抱歉延迟接受答案。这是我在 *** 上的第一次对话,所以我还有很多东西要学。 :P

以上是关于如何使用 ExternalProject_Add 静态链接到 NATS C 库的主要内容,如果未能解决你的问题,请参考以下文章

如何将环境变量传递给 ExternalProject_Add CONFIGURE_COMMAND?

ExternalProject_Add 使用 pybind11 进行 CMake 项目的智能方法

CMake ExternalProject_Add() 和 FindPackage()

cmake:ExternalProject_Add() 不应用 cmake 参数

CMake 使 add_library 依赖于 ExternalProject_Add

CMake ExternalProject_Add 中的 URL 问题