Я получил небольшой пример проекта, в котором я пытаюсь связать динамическую библиотеку с исполняемым файлом.
Структура файла выглядит следующим образом:
-проект
cmake_minimum_required (VERSION 3.3.2)
# Project
# --------------
project (cmakefun)
# Subdirectories
# --------------
add_subdirectory(dlibs)
add_subdirectory(exes)
# Target
# --------------
set(CMAKE_INSTALL_PREFIX "${PROJECT_SOURCE_DIR}/cmakefun")
—dlibs
—-engine.h
#pragma once
#include <iostream>
class Engine {
public:
Engine();
void Function();
};
—-engine.cpp
#include "engine.h"
using namespace std;
Engine::Engine(){}
void Engine::Function() {
cout << "Function" << endl;
}
—-CMakeLists.txt
# Project
# --------------
project(engine)
# Headers and Sources
# --------------
set(${PROJECT_NAME}_headers engine.h)
set(${PROJECT_NAME}_sources engine.cpp)
# Create Binaries
# --------------
add_library (${PROJECT_NAME} SHARED ${${PROJECT_NAME}_headers} ${${PROJECT_NAME}_sources})
# Target
# --------------
install(TARGETS ${PROJECT_NAME}
RUNTIME DESTINATION bin
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib/static)
—EXE
—-main.h
#pragma once
#include <iostream>
—-main.cpp
#include "main.h"#include "../dlibs/engine.h"
int main( int argc, char* args[] ) {
Engine a;
a.Function();
return 0;
}
—-CMakeLists.txt
# Project
# --------------
project(exe)set(CMAKE_VERBOSE_MAKEFILE ON)
set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib")
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)# Headers and Sources
# --------------
set(${PROJECT_NAME}_headers "")
set(${PROJECT_NAME}_sources main.cpp)
# Create Binaries
# --------------
add_executable (${PROJECT_NAME} ${${PROJECT_NAME}_headers} ${${PROJECT_NAME}_sources})
# Linker
# --------------
target_link_libraries(${PROJECT_NAME} engine)
# Target
# --------------
install(TARGETS ${PROJECT_NAME}
RUNTIME DESTINATION bin
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib/static)
Вот что я делаю, чтобы запустить его:
mkdir build
cd build
cmake ..
make install
../cmakefun/bin/exe
Ошибка, которую я получаю:
dyld: Library not loaded: @rpath/libengine.dylib
Referenced from: *absolute path*/cmakefun/bin/exe
Reason: image not found
Trace/BPT trap: 5
Однако сгенерированный файл внутри папки сборки работает. Насколько я знаю, мне нужно установить относительный RPath, если я использую ‘make install’ и я попробовал это:
set(CMAKE_VERBOSE_MAKEFILE ON)
set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib")
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
Внутри CMakteLists.txt (exe-папка), но с теми же результатами.
Я пробовал несколько других способов установки RPath, но безрезультатно.
Любая помощь с благодарностью.
С уважением
У меня была такая же проблема, и в конце концов я смог решить эту проблему, используя эту тему.
CMAKE RPATH с упаковкой
и вики
https://cmake.org/Wiki/CMake_RPATH_handling
.
В исполняемом файле CMakeLists.txt вам нужно
# Project
projet(exe)
# set all you waft to set...
# get your sources...
# set RPATH according to the wiki
# use, i.e. don't skip the full RPATH for the build tree
SET(CMAKE_SKIP_BUILD_RPATH FALSE)
# when building, don't use the install RPATH already
# (but later on when installing)
SET(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
SET(CMAKE_INSTALL_RPATH "${my_install_path}")
# add the automatically determined parts of the RPATH
# which point to directories outside the build tree to the install RPATH
SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
# Create binaries
add_executable(my_exe ${my_sources})
# add your libraries...
# Install target
install(TARGET my_exe ${my_options})
Других решений пока нет …