более ранний пост
В 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? Или это связано только с ВТК и как были созданы общие библиотеки?