我們編譯生成的可執行文件一般,會生成在當前的編譯路徑下,也就是build或者release路徑下。那麼如何將編譯生成的可執行文件和庫文件打包到一起進行發布那?本片教程我們將講述如何在cmake中配置install的打包路徑。下面我們將以mathlib庫和頭文件為例子進行配置。
(2)CMake 的使用環境和安裝本教程的使用環境為:
ubutu18.04 lts
gcc version 7.5.0
g++ version 7.5.0
cmake version 3.10.2
安裝cmake:
sudo apt install cmake
(3)設置設置我們的程序輸出為lib文件配置庫文件、頭文件和執行文件到install的目錄下,cmake中的install根目錄為CMAKE_INSTALL_PREFIX變量的路徑,如果我們要設置配置路徑可以使用set命令設置CMAKE_INSTALL_PREFIX變量的值來改變路徑。一般默認情況CMAKE_INSTALL_PREFIX變量的值為,在UNIX系統中為:/usr/local,在windows系統中為:c:/Program Files/${PROJECT_NAME}
首先,看一下整體的目錄結構:
|-- tutorial_fourth/
|-- src/
|-- tutorial.cpp
|-- include/
|--TutorialConfig.h.in
|-- mathlib/
|-- CMakeLists.txt
|-- mathlib.h
|-- mathlib.cpp
|-- CMakeLists.txt
根目錄下的CMakeLists.txt文件為:
# 設置cmake的最低版本
cmake_minimum_required(VERSION 3.10)
# 設置工程名稱 和版本
project(tutorial VERSION 1.0)
# 設置指定的C++編譯器版本是必須的,如果不設置,或者為OFF,則指定版本不可用時,會使用上一版本。
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# 指定為C++11 版本
set(CMAKE_CXX_STANDARD 11)
# 提供一個選項是OFF或者ON,如果沒有初始值被提供則默認使用OFF
option(USE_MYMATH "Use tutorial provided math implementation" ON)
# 指定版本號的配置文件
configure_file(include/TutorialConfig.h.in TutorialConfig.h)
# 判斷變量USE_MYMATH是否設置了ON,如果設置了配置MathFunctions library
if(USE_MYMATH)
# 添加一個名字為MathFunctions的子編譯路徑
add_subdirectory(mathlib)
# 列出MathFunctions庫的所有項目,並添加到外部庫變量EXTRA_LIBS中
list(APPEND EXTRA_LIBS mathlib)
# 將子路徑"${PROJECT_SOURCE_DIR}/mathlib"添加到外部路徑變量EXTRA_INCLUDES中
list(APPEND EXTRA_INCLUDES "${PROJECT_SOURCE_DIR}/mathlib")
endif()
# 增加生成可執行文件,生成的程序名稱為:tutorial_first
add_executable(tutorial src/tutorial.cpp)
# 對目標的外部庫進行連結操作,需要放在定義了tutorial以後
target_link_libraries(tutorial PUBLIC ${EXTRA_LIBS})
# 為指定項目添加 include 路徑,需要放在定義了tutorial以後
target_include_directories(tutorial PUBLIC
"${PROJECT_BINARY_DIR}"
${EXTRA_INCLUDES}
)
# 下面配置install,根目錄為 CMAKE_INSTALL_PREFIX變量中的路徑
# 配置可執行文件到安裝路徑 CMAKE_INSTALL_PREFIX的bin中
install(TARGETS tutorial DESTINATION bin)
# 配置程序的頭文件到安裝路徑 CMAKE_INSTALL_PREFIX的include文件中
install(FILES "${PROJECT_BINARY_DIR}/TutorialConfig.h"
DESTINATION include
)
mathlib路徑下CMakeLists.txt文件為:
# 生成庫文件名為mathlib的靜態庫
add_library(mathlib STATIC mysqrt.cpp) # 可以配置STATIC、SHARED和MODULE
# 設置動態庫的版本 為1.2
SET_TARGET_PROPERTIES(mathlib PROPERTIES VERSION 1.2 SOVERSION 1)
# 將程序段額依賴庫輸出到安裝路徑 CMAKE_INSTALL_PREFIX的lib文件夾中
install(TARGETS mathlib DESTINATION lib)
# 將文件mathlib.h輸出到安裝目錄 CMAKE_INSTALL_PREFIX下的include文件夾中
install(FILES mathlib.h DESTINATION include)
命令使用:
install: 配置程序打包過程中的目標(TARGETS)、文件(FILES)、路徑(DIRECTORY)、代碼(CODE)和輸出配置(EXPORT)
install(TARGETS <target>... [...])
install({FILES | PROGRAMS} <file>... [...])
install(DIRECTORY <dir>... [...])
install(SCRIPT <file> [...])
install(CODE <code> [...])
install(EXPORT <export-name> [...])
使用demo:
install(TARGETS myExe mySharedLib myStaticLib
RUNTIME DESTINATION bin
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib/static)
CMake在生成文件的過程中會生成很多中間緩存文件,為了使項目更簡潔,文件路徑更清楚,一般會在項目的root目錄下建立一個文件夾,用於存儲CMake生成的中間文件。而一般使用的文件家名稱為build或者release。下面是使用命令:
# 進入項目的root目錄,本文為:tutorial_first
cd tutorial
# 創建存儲緩存文件的文件夾,build
mkdir build
# 使用CMake命令生成makefile文件
cmake ..
# 使用make命令進行編譯
cmake --build .
實時分享CVPR、ECCV等會議,關注深度學習、自動駕駛領域,我們期待你的加入。點擊上方「CNNer」,選擇加「星標」或「置頂」精選乾貨,當日達。
長按關注▲ 長按加微信▲
備註:研究方向+地點+學校/公司+暱稱,更快通過申請,長按加細分領域技術交流群,目前有細分領域:圖像分割、圖像目標檢測、論文寫作、車道檢測、模型優化、目標跟蹤、SLAM、點雲處理(分割檢測)、深度學習。
PS:騰訊最近更改公眾號推送規則,文章推送不在按照時間排序,而是通過智能推薦算法有選擇的推送文章,為了避免收不到文章,看完文章您可以點擊一下右下角的"在看",以後發文章就會第一時間推送到你面前。
獲取完整項目工程,公眾回覆:CMakeDemo5
聲明:文章來自於網絡,僅用於學習分享,版權歸原作者所有,侵權請加上文微信聯繫刪除。點個「在看」,讓我知道你的愛👇👇