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