CMake: связывание разделяемой библиотеки с другими библиотеками с относительным путем для распространения - PullRequest
0 голосов
/ 03 мая 2019

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

Проблема : поскольку мои пользователи lib наверняка переместят его в дерево каталогов, отличное от моего, моя библиотека должна искать его зависимости, используя относительныедорожка.Я имею в виду всегда или, по крайней мере, также, поиск в ./libs каталоге.

Вопрос : Как изменить мой CMakeLists.txt, чтобы выполнить эту задачу?

Дерево моего проекта :

myproject/
|---- CMakeLists.txt
|---- build/
|---- libs/
  |---- libdep1.so.1.2
  |---- libdep2.so.2.1
  |---- libdep3.so.0.6
|---- src/
  |---- file0.cpp
  |---- file1.cpp
  |---- file1.hpp
  |---- file2.cpp
  |---- file2.hpp
  • build - это каталог, в который я cd/build буду звонить cmake .. и make.
  • libs - это каталог, в который я буду копировать все зависимости (другие библиотеки), чтобы поделиться с моей библиотекой.
  • src - это каталог, в котором у меня естьвсе мои файлы cpp и hpp.

My CMakeLists.txt

cmake_minimum_required(VERSION 2.8.12)
project(myproject)

SET(CMAKE_BUILD_TYPE Debug)
SET(CMAKE_VERBOSE_MAKEFILE ON)

add_definitions(-std=c++11 -fPIC -m64)

SET (THIRD_PARTY_INCLUDE_ONE /home/3rdparty/xpto/include/)
SET (THIRD_PARTY_INCLUDE_TWO /home/3rdparty/ypto/include/)

include_directories(${THIRD_PARTY_INCLUDE_ONE} ${THIRD_PARTY_INCLUDE_TWO})

add_library(
    mysharedlib SHARED
    ${CMAKE_SOURCE_DIR}/src/file0.cpp
    ${CMAKE_SOURCE_DIR}/src/file1.cpp
    ${CMAKE_SOURCE_DIR}/src/file2.cpp)

SET (DEP_LIBS ${CMAKE_SOURCE_DIR}/libs)

target_link_libraries(
    mysharedlib
    ${DEP_LIBS}/libdep1.so.1.1
    ${DEP_LIBS}/libdep2.so.2.1
    ${DEP_LIBS}/libdep3.so.0.6)

EDIT 1 :

Я пытался использовать SET (CMAKE_SHARED_LINKER_FLAGS "-Wl,-rpath,$ORIGIN/libs") как раз перед add_library(...), но, похоже, ничего не дало.Я думал, что это может быть потому, что я связываю зависимости, используя ${DEP_LIBS}/, но если я удаляю его, он больше не может найти библиотеки, а также вызывает ошибку, говоря, что я должен перекомпилировать зависимости, используя -fPIC.Я убежден, что это побочный эффект, потому что все библиотеки являются общими (libnameofthelib.so) и работают с CMakeFile.txt без этого нового флага.

1 Ответ

0 голосов
/ 03 мая 2019

Я провел еще несколько тестов и, на самом деле, использование SET (CMAKE_SHARED_LINKER_FLAGS "-Wl,-rpath,$ORIGIN/libs") решило проблему.

...