關於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可執行文件即可。