【问题标题】:RPath not working with Make Install generated from CMakeRPath 不适用于从 CMake 生成的 Make Install
【发布时间】:2016-04-04 16:20:57
【问题描述】:

我有一个小型示例项目,我正在尝试将动态库链接到可执行文件。

文件结构如下:

-项目

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

但是在 build 文件夹中生成的文件可以工作。据我所知,如果我使用“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 的方法,但无济于事。

非常感谢任何帮助。

最好的问候

【问题讨论】:

    标签: c++ cmake makefile rpath


    【解决方案1】:

    我刚遇到同样的问题,最后我可以使用这个主题解决我的问题 CMAKE RPATH with packaging 和维基 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})
    

    【讨论】:

      猜你喜欢
      • 2020-02-07
      • 2017-07-30
      • 2013-01-24
      • 1970-01-01
      • 2012-02-16
      • 2010-12-16
      • 1970-01-01
      • 2015-01-31
      • 1970-01-01
      相关资源
      最近更新 更多