#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 напрямую со статической библиотекой, которая его использует. И это работает.