【问题标题】:cmake - Is it possible to link executable to shared library with relative path at runtime?cmake - 是否可以在运行时将可执行文件链接到具有相对路径的共享库?
【发布时间】:2015-08-06 10:49:58
【问题描述】:

假设我有这个:

../project_dir
    main.cpp
    mylib.cpp
    mylib.h

构建步骤将是:

g++ -c mylib.cpp -o mylib.o
g++ -shared -o libmylib.so mylib.o
g++ -L$(pwd) -Wl,-rpath='$ORIGIN' -o exec main.cpp -lmylib

exec 将是我的二进制可执行输出。当我测试时:

ldd exec

输出行是:

libmylib.so => /full/path/to/build/directory/libmylib.so (0x00007f75fdd1f000)

那条输出线是我的问题,是否可以得到:

libmylib.so => ./libmylib.so

所以每当我移动可执行文件时,我都可以移动共享库。如果可能的话,如何用cmake做到这一点?

【问题讨论】:

    标签: c++ cmake shared-libraries


    【解决方案1】:

    只需添加您的 CMakefiles.txt

    set(CMAKE_INSTALL_RPATH "$ORIGIN")
    set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE) # only if you want copy from the build tree
    

    【讨论】:

    • 当我用 $ORIGIN 添加上面的两行以及上面的行时,这仍然失败:/usr/local/bin/cmake -E cmake_link_script CMakeFiles/app.dir/link.txt - -verbose=1 /usr/bin/c++ -Wl,-rpath -Wl,$ORIGIN -rdynamic CMakeFiles/app.dir/app.cpp.o -o app -Wl,-rpath,"\$ORIGIN" CMakeFiles/app .dir/app.cpp.o:在函数main': app.cpp:(.text+0x42): undefined reference to MyClass::app(std::string const&)' collect2:错误:ld 返回 1 退出状态 CMakeFiles/app.dir/build.make:94:目标配方'app' 失败 make[2]: *** [app] 错误 1
    • CMake 已经更新,所以可能有一些变化,这些行现在肯定是错误的。对不起,多年来我不再反对 CMake,所以我不知道这些变化。跨度>
    【解决方案2】:

    当您启动 ldd 以检查您的应用共享库依赖项时,它始终会打印绝对路径。但是,如果您将-rpath 选项与$ORIGIN 变量一起使用,那么一切都会按您的预期进行。您可以移动可执行文件和共享库,删除原始构建目录,您仍然可以启动您的应用程序。

    这就是使用cmake 的方法:

    project(myapp)
    cmake_minimum_required(VERSION 2.8)
    
    set(APP_SRC main.cpp)
    set(LIB_SRC mylib.cpp)
    
    link_directories(${CMAKE_CURRENT_BINARY_DIR})
    
    SET(CMAKE_EXE_LINKER_FLAGS
              "${CMAKE_EXE_LINKER_FLAGS} -Wl,-rpath -Wl,$ORIGIN")
    
    add_library(mylib SHARED ${LIB_SRC})
    
    add_executable(${PROJECT_NAME} ${APP_SRC})
    
    target_link_libraries(${PROJECT_NAME} mylib)
    

    【讨论】:

    • 硬编码编译器特定的链接器标志对于 buildtool-generators (cmake) 是不行的。设置全局编译器/链接器标志变量 (CMAKE_EXE_LINKER_FLAGS) 是不行的。
    【解决方案3】:

    我必须在 ${ORIGIN} 周围加上花括号并添加要链接的库的路径:

    SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -L${CMAKE_BINARY_DIR} -lmyLibrary -Wl,-rpath -Wl,${ORIGIN}")
    set(CMAKE_INSTALL_RPATH "${ORIGIN}")
    set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
    

    【讨论】:

      猜你喜欢
      • 2021-06-16
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 2016-01-31
      • 1970-01-01
      • 2022-11-10
      • 1970-01-01
      • 2018-10-10
      相关资源
      最近更新 更多