2016-04-04 24 views
2

私は動的ライブラリを実行可能ファイルにリンクしようとしている小さなサンプルプロジェクトを手に入れました。RPakeがCMakeから作成されたMake Installで動作しない

ファイルの構造を次のように

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

は、これは私がそれを実行するために何をすべきかです:

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 

ビルドフォルダの内部に生成されたファイルは、しかし、動作します。しかし同じで、CMakteLists.txt(exeファイルのフォルダ)の内部

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

:私は「make installを」と私はこれを試してみた使用している場合は私の知る限りでは、私は相対RPATHを設定する必要があります結果。

私はRPathを設定するいくつかの方法を試しましたが、役に立たないものです。

ご協力いただきまして誠にありがとうございます。

よろしく

答えて

0

私は同じ問題を抱えていたし、最後に、私はこのトピック CMAKE RPATH with packaging とWiki 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}) 
が必要
関連する問題