《Clion開發(fā)C/C++系列》- CMAKE配置RPATH

前言

C/C++開發(fā)Linux程序時,有時候需要依賴第三方的so庫,可是編譯之后的產(chǎn)物,在運行起來的時候,該去哪里找之前編譯期間的so庫呢?

有好幾種方案,我就說普遍的:

  1. 在LD_LIBRARY_PATH環(huán)境變量里,加入你的so庫的文件夾

2.在編譯期間,指定運行時搜尋庫的地址,可以是相對地址也可以是絕對地址

這個我也是嘗試了好久,網(wǎng)絡上的教程幾乎都翻了個遍,都沒用,后來被我嘗試出來了:

關鍵

SET_TARGET_PROPERTIES(FFmpegLog PROPERTIES BUILD_RPATH "$ORIGIN/../;/another/run/path" LINK_FLAGS "-Wl,--disable-new-dtags")

這里面的 $ORIGIN 代表可運行文件本身,那么 $ORIGIN/../ 的意思是可執(zhí)行文件相同的目錄下,

如果有多個目錄,用 ; 分開

最后的 LINK_FLAGS "-Wl,--disable-new-dtags" 是一定要添加的,我嘗試過不添加,結果就是不生效。

示例

這里給一個我使用FFMpeg開發(fā)的CmakeList.txt作為例子:

cmake_minimum_required(VERSION 3.22.1)
project(FFmpegLog)

set(CMAKE_CXX_STANDARD 20)
# 設置幾種類型的變異產(chǎn)物的輸出位置
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/bin)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/bin)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/bin)

# 把所需要用到的so庫,設置在一個變量里
set(FFMPEG_LIBS
        /home/xiaolei/ClionProjects/FFmpeg/output/lib/libavcodec.so
        /home/xiaolei/ClionProjects/FFmpeg/output/lib/libavdevice.so
        /home/xiaolei/ClionProjects/FFmpeg/output/lib/libavfilter.so
        /home/xiaolei/ClionProjects/FFmpeg/output/lib/libavformat.so
        /home/xiaolei/ClionProjects/FFmpeg/output/lib/libavutil.so
        /home/xiaolei/ClionProjects/FFmpeg/output/lib/libswresample.so
        /home/xiaolei/ClionProjects/FFmpeg/output/lib/libswscale.so
)
# 鏈接庫的目錄
link_directories(/home/xiaolei/ClionProjects/FFmpeg/output/lib)
# 引入頭文件的目錄
include_directories(/home/xiaolei/ClionProjects/FFmpeg/output/include)
# 自己的源碼文件的目錄
aux_source_directory(${CMAKE_SOURCE_DIR}/src DIR_MAIN_SRCS)

# 設置編譯產(chǎn)物位可執(zhí)行文件
add_executable(FFmpegLog ${DIR_MAIN_SRCS})

# 把可執(zhí)行文件與第三方動態(tài)庫鏈接起來。
target_link_libraries(
        FFmpegLog PUBLIC
        avcodec
        avdevice
        avfilter
        avformat
        avutil
        swresample
        swscale
)

# 設置RPARH
SET_TARGET_PROPERTIES(FFmpegLog PROPERTIES BUILD_RPATH "$ORIGIN/../;/another/run/path" LINK_FLAGS "-Wl,--disable-new-dtags")

#在編譯結束后,執(zhí)行自定義腳本,把剛才列出的so庫循環(huán)拷貝到指定目錄下(其實就是生成的可執(zhí)行文件目錄下)
foreach(LIB_FILE ${FFMPEG_LIBS})
    add_custom_command(TARGET FFmpegLog POST_BUILD
            COMMAND ${CMAKE_COMMAND} -E copy_if_different
            ${LIB_FILE}
            ${CMAKE_SOURCE_DIR}/bin
    )
endforeach()

End.

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容