Ошибки компоновщика при связывании встроенного libevent как статической библиотеки, но работает при связывании как разделяемой библиотеки

#c #cmake #linker #static-libraries #libevent

#c #cmake #компоновщик #статические библиотеки #libevent

Вопрос:

Я создал библиотеку libevent из исходного кода как статическую библиотеку, используя компилятор GCC (в Linux). Параметры 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 .
И моя программа скомпилирована нормально. Почему статическая библиотека не связывает?
Что я делаю не так?
Заранее спасибо!

Комментарии:

1. Помимо ${CMAKE_SOURCE_DIR}/libevent_core.a библиотеки, вам необходимо связать с библиотеками, от которых она зависит. В отличие от разделяемой библиотеки, статическая библиотека не содержит списка ее зависимостей.

2. Используется nm для перечисления символов, определенных в библиотеках.

3. @Tsyvarev, я пытался связать libevent.a, libevent_core.a, libevent_extra.a и libevent_pthreads.a. Никакого результата. @stark, я проверил все свои статические библиотеки, на самом деле, ни одна из них не содержит event_new функции. Это странно. Но event_add содержит также неопределенную ссылку. Я могу опубликовать список символов в библиотеках. Делать?

4. @stark, я допускаю ошибку, event_new она тоже есть в libevent_core.a . Все функции, на которые есть неопределенная ссылка, определены в библиотеках.

5. Я кратко взглянул на CMakeLists.txt файл, и похоже, что файл предоставляет install / export , поэтому вы должны иметь возможность установить библиотеку в каталог по вашему выбору: cmake -B build -S . ... -D CMAKE_PREFIX=<path to install to> и после того, как библиотека будет собрана 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 или аналогичный)

Ответ №1:

Решаемая. Я использовал target_link_libraries для исполняемого файла, но libevent использовался в статической библиотеке, которая ссылается на исполняемый файл. Теперь я связываю libevent напрямую со статической библиотекой, которая его использует. И это работает.