2016-05-02 2 views
0

Я связываю стороннюю библиотеку с моим исполняемым файлом. Есть 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 
+0

Является ли ваш исполняемый файл также ссылкой на все библиотеки? Вы не указали эту часть. – ToniBig

+0

Да, они ..add_library() делает это – Nikhil

+1

Я думаю, что 'target_link_libraries' - это то, что вам нужно. 'add_library' просто создает цель для библиотеки, которая не может быть выполнена. – ToniBig

ответ

0

Я предлагаю вам компилировать с помощью CMake многословный режим для того, чтобы проверить полную команду, используемую для компиляции.

Для того, чтобы сделать это, вы должны скомпилировать с помощью следующей команды:

make VERBOSE=1 

Таким образом, вы можете проверить, какие это библиотека, которая была связана идентификация проблемы.

Возможные причины неопределенном эталонным ошибки:

  • библиотека не была найдена (проверьте, -L и -l флаги в команде г ++, являются правильными и, в случае ошибки, изменить CMake в получить желаемый результат);
  • В той же системе есть больше версий одной и той же библиотеки (в вашем случае libssh): компилятор мог использовать файлы заголовков версии и библиотеки другого, которые могли бы иметь другую сигнатуру, создающую ошибки связывания.
Смежные вопросы