Как связать с библиотекой libdl в cmake
Мое приложение зависит от OpenSSL. Итак, я загрузил и собрал OpenSSL и разместил статические библиотеки (libssl.a
а также libcrypto.a
) Мне нужен известный каталог, который я контролирую. В файле cmake моего приложения я используюfind_library
, чтобы определить полный путь к каждой библиотеке, сохранить пути в переменной списка и добавить эту переменную списка в target_link_libraries
команда. Это работает, поскольку символы OpenSSL видны моему приложению.
OpenSSL также зависит от библиотеки "Загрузчик динамической компоновки" (также известной как libdl
). Я знаю, что сборка OpenSSL использовала-ldl
вариант компилятора, потому что я вижу его в выводе сборки.
На моей машине разработки Linux libdl
библиотека, кажется, уже установлена. Доказательства:
libdl.so
а такжеlibdl.so.2
(которые являются символическими ссылками на фактическиеlibdl-2-17.so
файл библиотеки) существуют в том, что кажется стандартным каталогом для таких вещей:/usr/lib64
- Когда я бегу
man dlclose
, Я получаю ожидаемую справочную страницу о библиотеке "Загрузчик динамической компоновки".
Однако при сборке приложения я получаю следующие ошибки компоновщика. Вlibdl
библиотека точно не найдена.
/usr/bin/ld: ../install/lib/libcrypto.a(dso_dlfcn.o): undefined reference to symbol 'dlclose@@GLIBC_2.2.5'
/usr/lib64/libdl.so.2: error adding symbols: DSO missing from command line
Вопрос 1
Должен ли cmake найти libdl.so
самостоятельно?
вопрос 2
В файле cmake моего приложения я могу использовать find_library
команда для определения полного пути к libdl
библиотеку и добавьте этот путь в target_link_libraries
команда. Обратите внимание, что мне не нужно было указывать путь. Это работает, но похоже на обходной путь.
Если мне необходимо явно искать полный путь к libdl.so
?
Вопрос 3
Есть ли в cmake более подходящий способ связывания со "стандартной" библиотекой, такой как libdl
?
cmake файл
Ниже приведены соответствующие фрагменты файла cmake моего приложения.
...
#------------------------------
# Search for openssl libraries.
set( OPENSSL_LIBRARIES )
find_library( temp libssl.a PATHS "${CMAKE_SOURCE_DIR}/3rd_party/" )
list( APPEND OPENSSL_LIBRARIES ${temp} )
unset( temp CACHE )
find_library( temp libcrypto.a PATHS "${CMAKE_SOURCE_DIR}/3rd_party/" )
list( APPEND OPENSSL_LIBRARIES ${temp} )
unset( temp CACHE )
#------------------------------
# Search for dl library.
# TODO: Is this workaround really necessary?
find_library( DL_LIBRARY libdl.so )
...
#------------------------------
# My application.
add_executable( myapp main.cxx )
set_target_properties( myapp PROPERTIES COMPILE_FLAGS "-g" )
target_link_libraries( myapp
${OPENSSL_LIBRARIES}
# TODO: Is this workaround really necessary?
${DL_LIBRARY}
)
install( TARGETS myapp DESTINATION ${BIN_INSTALL_DIR} )
версия cmake
Я использую cmake версии 2.8.12, но конкретная версия может не иметь значения.