2016-04-04 16 views
2

Ich habe ein kleines Beispielprojekt, wo ich versuche, eine dynamische Bibliothek in eine ausführbare zu verknüpfen.RPath funktioniert nicht mit Make Install generiert von CMake

Dateistruktur wie folgt:

-project

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) 

Dies ist, was ich tun, um es auszuführen:

mkdir build 
cd build 
cmake .. 
make install 
../cmakefun/bin/exe 

Der Fehler erhalte ich:

dyld: Library not loaded: @rpath/libengine.dylib 
Referenced from: *absolute path*/cmakefun/bin/exe 
Reason: image not found 
Trace/BPT trap: 5 

Die erzeugte Datei innerhalb des Build-Ordner funktioniert jedoch. Soweit ich weiß, ich brauche die relative rpath zu setzen, wenn ich verwende ‚make install‘ und ich habe dies versucht:

set(CMAKE_VERBOSE_MAKEFILE ON) 
set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib") 
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) 

Innerhalb des CMakteLists.txt (exe-Ordner), aber mit dem gleichen Ergebnisse.

Ich habe mehrere andere Möglichkeiten zum Einstellen des RPath versucht, aber ohne Erfolg.

Jede Hilfe wird sehr geschätzt.

Mit freundlichen Grüßen

Antwort

0

Ich hatte gerade das gleiche Problem, und am Ende kann ich mein Problem mit diesem Thema CMAKE RPATH with packaging und das Wiki https://cmake.org/Wiki/CMake_RPATH_handling lösen.

In der ausführbaren CMakeLists.txt, müssen Sie

# 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})