Как связать с библиотекой libdl в cmake

Мое приложение зависит от OpenSSL. Итак, я загрузил и собрал OpenSSL и разместил статические библиотеки (libssl.a а также libcrypto.a) Мне нужен известный каталог, который я контролирую. В файле cmake моего приложения я используюfind_library, чтобы определить полный путь к каждой библиотеке, сохранить пути в переменной списка и добавить эту переменную списка в target_link_librariesкоманда. Это работает, поскольку символы OpenSSL видны моему приложению.

OpenSSL также зависит от библиотеки "Загрузчик динамической компоновки" (также известной как libdl). Я знаю, что сборка OpenSSL использовала-ldl вариант компилятора, потому что я вижу его в выводе сборки.

На моей машине разработки Linux libdlбиблиотека, кажется, уже установлена. Доказательства:

  1. libdl.so а также libdl.so.2 (которые являются символическими ссылками на фактические libdl-2-17.so файл библиотеки) существуют в том, что кажется стандартным каталогом для таких вещей: /usr/lib64
  2. Когда я бегу 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, но конкретная версия может не иметь значения.

0 ответов

Другие вопросы по тегам