Я связываю стороннюю библиотеку с моим исполняемым файлом. Есть buch из других библиотек, с которыми я успешно связан. Я не могу понять, что я делаю неправильно.Cmake: Как проверить, связана ли библиотека с исполняемым файлом
Это кусок, который является причиной проблемы
# Build libssh 0.7.3
ExternalProject_Add(libssh2
URL ${PROJECT_SOURCE_DIR}/packages/libssh.tar.gz
PREFIX ${CMAKE_BINARY_DIR}/external/libssh2
CONFIGURE_COMMAND ""
UPDATE_COMMAND ""
BUILD_COMMAND mkdir -p <SOURCE_DIR>/build && cd <SOURCE_DIR>/build &&
cmake -DWITH_STATIC_LIB=1 -DCMAKE_INSTALL_PREFIX=<INSTALL_DIR> -DCMAKE_BUILD_TYPE=Debug .. && make
INSTALL_COMMAND cd <SOURCE_DIR>/build && make install PREFIX=<INSTALL_DIR>
)
ExternalProject_Get_Property(libssh2 install_dir)
add_library(libssh STATIC IMPORTED)
set_property(TARGET libssh PROPERTY IMPORTED_LOCATION
${install_dir}/lib/libssh.a)
add_dependencies(libssh libssh2)
include_directories(${install_dir}/include)
Это еще одна третьей стороны, правильно связывая
ExternalProject_Add(libevent2
URL ${PROJECT_SOURCE_DIR}/packages/libevent-2.0.21-stable.tar.gz
PREFIX ${CMAKE_BINARY_DIR}/external/libevent2
CONFIGURE_COMMAND <SOURCE_DIR>/configure --prefix=<INSTALL_DIR>
UPDATE_COMMAND ""
)
ExternalProject_Get_Property(libevent2 install_dir)
add_library(libevent STATIC IMPORTED)
set_property(TARGET libevent PROPERTY IMPORTED_LOCATION
${install_dir}/lib/libevent.a)
add_dependencies(libevent libevent2)
include_directories(${install_dir}/include)
ошибки, которую я вижу
Linking C executable ../../bin/nixia
CMakeFiles/nixia.dir/main_config.c.o: In function `main_config_dump':
/home/nikhil/nixia/src/main/main_config.c:88: undefined reference to `ssh_new'
/home/nikhil/nixia/src/main/main_config.c:91: undefined reference to `ssh_options_set'
collect2: ld returned 1 exit status
библиотека правильно создается
[[email protected] lib]$ ls
cmake libssh.a libssh.so libssh.so.4 libssh.so.4.4.1 libssh_threads.a libssh_threads.so libssh_threads.so.4 libssh_threads.so.4.4.1 pkgconfig
[[email protected] lib]$ pwd
/home/nikhil/nixia/build/external/libssh2/lib
Библиотека содержит определение функции
[[email protected] lib]$ ar x libssh.a | nm * | grep ssh_new
nm: Warning: 'cmake' is not an ordinary file
U ssh_new
0000000000000000 T ssh_new
00000000000351b0 T ssh_new
00000000000351b0 T ssh_new
00000000000351b0 T ssh_new
Является ли ваш исполняемый файл также ссылкой на все библиотеки? Вы не указали эту часть. – ToniBig
Да, они ..add_library() делает это – Nikhil
Я думаю, что 'target_link_libraries' - это то, что вам нужно. 'add_library' просто создает цель для библиотеки, которая не может быть выполнена. – ToniBig