Как статически ссылаться на библиотеку NATS C с помощью ExternalProject_Add - PullRequest
0 голосов
/ 19 июня 2020

Я пытаюсь включить клиент 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'
...

Странная часть - когда я изменил метод ссылки с stati c на общий, сборка прошла успешно и программа работает, как ожидалось. Соответствующие коды включены в CMakeLists.txt.

Исходный код, который вызывает указанную выше ошибку, можно получить с помощью git clone https://github.com/onichandame/nats-epics.git --branch question --depth 1

Среда разработки - CentOS 8. Я сделал docker изображение для этой среды onichandame/docker-dev

1 Ответ

1 голос
/ 19 июня 2020

Когда вы связываете его с библиотекой stati c 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})
...