CMake教程之安裝部署工程

關於CMake的使用,今天簡單記錄下關於其安裝和共享庫使用的方式。
關於安裝
如下trunk工程目錄:
這裏寫圖片描述

這裏需要將main可執行文件和runhello.sh腳本文件安裝到統一目錄下,關於文檔和COPYRIGHT安裝到文檔目錄下。
如下是當前目錄下的CMakeLists.txt文件內容:

  1 PROJECT (HELLO)
  2 ADD_SUBDIRECTORY(source)
  3 INSTALL(FILES COPYRIGHT README DESTINATION share/trunk/)
  4 INSTALL(PROGRAMS runhello.sh DESTINATION share/trunk/bin)
  5 INSTALL(DIRECTORY doc/ DESTINATION share/trunk/doc)

如上分別是安裝文件、程序、目錄的方式
在source下的CMakeLists.txt內容如下:

  1 ADD_EXECUTABLE(hello main.c)
  2 INSTALL(TARGETS hello RUNTIME DESTINATION share/trunk/bin)

如上爲安裝可執行文件的方式。

執行方式:
在根目錄下創建bin文件:
cmake -DCMAKE_INSTALL_PREFIX=/tmp …
這裏用於測試安裝到tmp目錄下。
make
make install
然後在安裝的目錄下查看安裝的文件

共享庫
關於共享庫,首先先使用cmake編譯生成一個簡單的共享庫
如下lib_trunk目錄下的文件:
這裏寫圖片描述

hello.h:

void HelloFunc();

hello.cpp:

  7 #include <stdio.h>
  8 
  9 #include "hello.h"
 10 
 11 void HelloFunc()
 12 {
 13     printf("hello world\n");
 14 }

查看lib下的CMakeLists.txt內容如下:

  1 SET(LIBHELLO_SRC hello.c)
  2 #這種方式靜態庫和動態庫的名字不能一樣
  3 ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC})
  4 #生成libhello_static.a
  5 ADD_LIBRARY(hello_static STATIC ${LIBHELLO_SRC})
  6 #如果需要生成同樣的前綴名,則如下:
  7 SET_TARGET_PROPERTIES(hello_static PROPERTIES OUTPUT_NAME "hello")
  8 
  9 #爲了防止每次構建時刪除同名的庫,則添加如下:
 10 SET_TARGET_PROPERTIES(hello PROPERTIES CLEAN_DIRECT_OUTPUT 1)
 11 SET_TARGET_PROPERTIES(hello_static PROPERTIES CLEAN_DIRECT_OUTPUT 1)
 12 
 13 #添加庫版本號,version爲庫版本,SOVERSION爲API版本
 14 SET_TARGET_PROPERTIES(hello PROPERTIES VERSION 1.2 SOVERSION 1)
 15 SET_TARGET_PROPERTIES(hello_static PROPERTIES VERSION 1.2 SOVERSION 1)
 16 
 17 INSTALL(TARGETS hello LIBRARY DESTINATION lib)
 18 INSTALL(TARGETS hello_static ARCHIVE DESTINATION lib)
 19 INSTALL(FILES hello.h DESTINATION include/hello)

如上是生成.so和.a 的方式,具體有註釋說明,下面是的install是添加動態庫和頭文件到目標文件下。
編譯和安裝:
同樣根目錄下創建bin文件:
cmake -DCMAKE_INSTALL_PREFIX=/usr …
make
make install
安裝完後就可以寫一個demo對該庫進行使用:
如下是use_lib_trunk目錄下的文件:
這裏寫圖片描述

main.c內容:

  8 #include <stdio.h>
  9 #include "hello.h"
 10 
 11 
 12 int main()
 13 {
 14     HelloFunc();
 15 
 16     return 0;
 17 }

main.c引用了hello.h的頭文件,調用了共享庫hello的函數HelloFunc()的內容。
在source下的CMakeLists加如下對共享庫的使用:

  1 ADD_EXECUTABLE(main main.c)
  2 INCLUDE_DIRECTORIES(/usr/include/hello)
  3 TARGET_LINK_LIBRARIES(main hello)

首先是頭文件的目錄位置,其次是對應的共享庫名。默認到/usr/lib下找。
同樣跟目下創建bin文件:
cmake …
make
然後執行main可執行文件即可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章