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可执行文件即可。

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