2

動的ライブラリを実行可能ファイルにリンクしようとしている小さなサンプル プロジェクトを取得しました。

ファイル構造は次のとおりです。

-事業

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

ただし、ビルド フォルダー内に生成されたファイルは機能します。私の知る限り、「make install」を使用している場合は相対 RPath を設定する必要があり、これを試しました。

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 を設定する他のいくつかの方法を試しましたが、役に立ちませんでした。

どんな助けでも大歓迎です。

よろしくお願いします

4

1 に答える 1

0

私はちょうど同じ問題を抱えていましたが、最終的にこのトピック CMAKE RPATH with packages と 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})
于 2016-11-21T15:59:18.690 に答える