- 在CMakeLists.txt實例運用(入門)中我們簡單的介紹了一下cmake的應用,這次我們接着上次的小例子繼續再來探索下一下,為了使程序的組織結構更加明確、高效的管理大程序項目,我們還得繼續研究他們之間的關系。
初始文件夾如下:src 、 include文件夾內容與原來一樣
- 這次的CMakeLists.txt增添了不少的內容:
1 # 聲明要求的 cmake 最低版本 2 cmake_minimum_required(VERSION 2.8) 3 # 聲明一個 cmake 工程 4 project(helloSLAM) 5 #設置生成的靜態動態庫文件存放的路徑 6 SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib) 7 SET(EXECUTABLE_OUTPUT_PATH /home/tianbot/myslam/ch1/bin)#設置生成的可執行文件存放的路徑 8 # 添加include目錄存放.h文件 9 include_directories("include") 10 11 # 添加庫( 庫名(自己設置)動態SHARED 靜態STATIC庫的實現文件及路徑,注意大小寫。指令大小寫無所謂,參數和變量大小寫有區別 ) 12 set(sayhello src/sayHello.cpp) 13 add_library(libHello STATIC ${sayhello})#生成靜態庫 14 add_library(libHello_so SHARED ${sayhello})#生成動態庫 15 #動態庫生成,但是與靜態庫一起生成時要在名字上區別才可以通過 16 SET_TARGET_PROPERTIES(libHello_so PROPERTIES OUTPUT_NAME "libHello") 17 #將動態庫設置為與靜態庫一樣的名字,解決靜態動態庫名字不一樣的問題 18
19 SET_TARGET_PROPERTIES(libHello PROPERTIES CLEAN_DIRECT_OUTPUT 1) 20 SET_TARGET_PROPERTIES(libHello_so PROPERTIES CLEAN_DIRECT_OUTPUT 1) 21 #避免生成libHello.so時把libHello.a清理掉22 SET_TARGET_PROPERTIES(libHello_so PROPERTIES VERSION 1.2 SOVERSION 1)
23 #設置動態庫(j靜態庫不能設置)版本號版本號VERSION 指代動態庫版本,SOVERSION 指代 API 版本
24 # 添加一個可執行程序,語法:add_executable( 程序名(自己設置,最后用於執行./sayHello) 源代碼文件及路徑 )
25 set(main src/main.cpp) 26 add_executable(sayHello ${main}) 27 28 # 將庫文件鏈接到可執行程序上(名字都是上面設置的,統一對應即可,這里對應為靜態庫,你也可以使用動態庫) 29 target_link_libraries(sayHello libHello) 30 #生成了庫我們要安裝后才能使用,系統中才能找到它,安裝動態和靜態庫到usr/lib文件夾下 31 INSTALL(TARGETS libHello_so libHello 32 LIBRARY DESTINATION lib 33 ARCHIVE DESTINATION lib) 34 #安裝頭文件到usr/include/sayhello文件夾下 35 INSTALL(FILES include/sayHello.h DESTINATION include/sayhello) 36 #DESTINATION的路徑為-DCMAKE_INSTALL_PREFIX=/usr指定的這個路徑,如果不指定CMAKE_INSTALL_PREFIX 的默認定義是/usr/local 37 #輸出一些消息 38 MESSAGE(STATUS "successful" )
- 執行命令 cmake -DCMAKE_INSTALL_PREFIX=/usr ..
- 文件夾結構如圖:注意bin和lib的路徑,體會文件中:#設置生成的靜態動態庫文件存放的路徑 SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
#設置生成的可執行文件存放的路徑SET(EXECUTABLE_OUTPUT_PATH /home/tianbot/myslam/ch1/bin)
- 執行make后:
- lib文件夾中生成了庫:(注意只有動態庫才需要版本,靜態庫編譯時就綁定在了程序中,具體含義查詢靜態庫和動態庫的原理就明白了)
- bin文件夾生成了可執行文件:
- 安裝sudo make install,將相關文件安裝到指定位置