более ранний пост

ема

В MacOS у меня возникают проблемы со связыванием во время выполнения проекта CMake, который зависит от динамически связанных ресурсов - но только после установки проекта! Проблема не возникает, когда я только собираю бинарный файл без его установки.

$ ./testapp
Hello world!
$ $INSTALLDIR/testapp
dyld: Library not loaded: @rpath/libvtkDomainsChemistryOpenGL2-7.1.1.dylib
  Referenced from: /Users/normanius/workspace/installdir/testapp
  Reason: image not found
[1]    76964 trace trap  /Users/normanius/workspace/installdir/testapp   
Минимальный пример

Я могу воспроизвести проблему в минимальной установке, состоящей изCMakeLists.txt а такжеmain.cpp, Библиотека, на которую я ссылаюсь, называетсяВТК (v7.1.1), который был собран с общими библиотеками (подробнее см. ниже).

# CMakeLists.txt
cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
project(test)

# Test application.
add_executable(testapp
               main.cpp)

# Find vtk (library that has to be linked to dynamically).
find_package(VTK REQUIRED)
include(${VTK_USE_FILE})
target_link_libraries(testapp ${VTK_LIBRARIES}) # <---- this causes the problem

# Install instructions.
install(TARGETS testapp DESTINATION "${CMAKE_INSTALL_PREFIX}")

main.cpp даже не использует какие-либо объекты VTK.

// main.cpp
#include <iostream>

int main (int argc, char* argv[])
{
    std::cout << "Hello world!" << std::endl;
    return 0;
}

Я строю проект с помощью следующих команд. ФлагCMAKE_PREFIX_PATH Я решил дать CMake подсказку о том, где найти библиотеку VTK.

$ INSTALLDIR="path/to/installation"
$ mkdir build && cd build
$ cmake .. -DCMAKE_PREFIX_PATH="$DEVPATH/lib/vtk/cmake" \
           -DCMAKE_BUILD_TYPE=Release \
           -DCMAKE_INSTALL_PREFIX="$INSTALLDIR" 
$ make
$ make install

При выполненииtestapp в папке build все выглядит нормально:

$ ./testapp
Hello world!
$ cp testapp $INSTALLDIR/testapp
$ $INSTALLDIR/testapp
Hello world!

Однако, если я запускаю исполняемый файл вINSTALLDIR Я получаю ошибку во время выполнения:

$ $INSTALLDIR/testapp
dyld: Library not loaded: @rpath/libvtkDomainsChemistryOpenGL2-7.1.1.dylib
  Referenced from: /Users/normanius/workspace/installdir/testapp
  Reason: image not found
[1]    76964 trace trap  /Users/normanius/workspace/installdir/testapp    

Естественно, проблема исчезнет, ​​если я уберуtarget_link_libraries() инструкция вCMakeLists.txt.

Итак, что именно происходит при установке проекта CMake? А что не так в моем случае? Я тестировал разные версии CMake (3.5, 3.9 и 3.10) - но поведение такое же.

подробности

По-видимому, механизм RPATH в MacOS не настроен должным образом для примера.

Это выдержка из структуры ссылокtestapp двоичная:

$ otool -L testapp
testapp:
    @rpath/libvtkDomainsChemistryOpenGL2-7.1.1.dylib (compatibility version 0.0.0, current version 0.0.0)
    @rpath/libvtkFiltersFlowPaths-7.1.1.dylib (compatibility version 0.0.0, current version 0.0.0)
    @rpath/libvtkFiltersGeneric-7.1.1.dylib (compatibility version 0.0.0, current version 0.0.0)
    @rpath/libvtkFiltersHyperTree-7.1.1.dylib (compatibility version 0.0.0, current version 0.0.0)
...

Потому что это может сыграть роль в создании библиотеки VTK (другой проект CMake): для поддержки python необходимо установить флаги проектаVTK_WRAP_PYTHON=ON а такжеBUILD_SHARED_LIBS=ON, Установочный префикс был установлен наCMAKE_INSTALL_PREFIX="$VTK_INSTALL_DIR", Чтобы убедиться, что ресурсы находятся во время выполнения, необходимо дополнительно включить поддержку RPATH черезCMAKE_MACOSX_RPATH=ON а такжеCMAKE_INSTALL_RPATH="$VTK_INSTALL_DIR/lib".

Заворачивать

Что я концептуально ошибаюсь? Что происходит при установке проекта сmake install? Можно ли решить эту проблему в CMake? Или это связано только с ВТК и как были созданы общие библиотеки?

Ответы на вопрос(1)

Ваш ответ на вопрос