本文用于记录个人在学习Cmake时,一些基础知识,以及以后所遇到的问题以及解决方法,仅供大家参考。
如何构建Cmake工程(准备工作):
进行外部构建,在工程目录文件下,建立build文件夹,用于存放编译过程中的过程文件;
在工程目录文件下,建立src文件夹,用于存放工程的源代码;
在工程目录文件下,建立doc文件夹,用于存放工程文档;
在工程目录文件下,添加文本文件COPYRIGHT,README;
值得注意的是,需要为任何一个子目录建立CMakeLists.txt。
如何编写CMakeLists.txt:
下面对常用指令进行介绍:
PROJECT (HELLO)
PROJECT指令的语法是:
PROJECT(projectname [CXX] [C] [Java])
你可以用这个指令定义工程名称,并可指定工程支持的语言,支持的语言列表是可以忽略的,默认情况表示支持所有语言。
SET(SRC_LIST main.c)
SET指令的语法是:
SET指令可以用来显式的定义变量。如果有多个源文件,也可以定义成:
SET(SRC_LIST main.c t1.c t2.c)
ADD_EXECUTABLE(hello ${SRC_LIST})
定义了这个工程会生成一个文件名为hello的可执行文件,相关的源文件是SRC_LIST中
定义的源文件列。
ADD_SUBDIRECTORY指令
ADD_SUBDIRECTORY(source_dir [binary_dir] [EXCLUDE_FROM_ALL])
这个指令用于向当前工程添加存放源文件的子目录,并可以指定中间二进制和目标二进制存放的位置。EXCLUDE_FROM_ALL参数的含义是将这个目录从编译过程中排除,比如,工程的example,可能就需要工程构建完成后,再进入example目录单独进行构建(当然,你也可以通过定义依赖来解决此类问题)。
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
如何安装?
1.安装COPYRIGHT/README,直接修改主工程文件CMakelists.txt,加入以下指令:
INSTALL(FILES COPYRIGHT README DESTINATION share/doc/[目标文件夹])
2.安装doc中的hello.txt
所以我们不能直接安装整个doc目录,这里采用的方式是安装doc目录中的内容,也就是使用”doc/”在工程文件中添加
INSTALL(DIRECTORY doc/ DESTINATION share/doc/[目标文件夹])
共享库与静态库
1.建立一个静态库和动态库,提供HelloFunc函数供其他程序编程使用,HelloFunc
向终端输出Hello World字符串。
2.安装头文件与共享库。
建立共享库:
mkdir lib
在工程目录下建立CMakeLists.txt,内容如下:
PROJECT(HELLOLIB)
ADD_SUBDIRECTORY(lib)
在lib目录下建立源文件以及头文件;
在lib目录下建立CMakeLists.txt,内容如下:
SET(LIBHELLO_SRC hello.c)
ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC})
建立build目录,进行编译,以在lib目录得到一个libhello.so。
如果你要指定libhello.so生成的位置,可以通过在主工程文件CMakeLists.txt中修改ADD_SUBDIRECTORY(lib)指令来指定一个编译输出位置或者在lib/CMakeLists.txt中添加SET(LIBRARY_OUTPUT_PATH <路径>)来指定一个新的位置。
ADD_LIBRARY(libname [SHARED|STATIC|MODULE] [EXCLUDE_FROM_ALL] source1 source2 … sourceN)
同时构建静态库与共享库:
SET_TARGET_PROPERTIES(hello PROPERTIES CLEAN_DIRECT_OUTPUT 1)
SET_TARGET_PROPERTIES(hello_static PROPERTIES CLEAN_DIRECT_OUTPUT
1)
利用INSTALL指令进行安装,向lib/CMakeLists.txt中添加如下指令:
INSTALL(TARGETS hello hello_static
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib)
INSTALL(FILES hello.h DESTINATION include/hello)
注意,静态库要使用ARCHIVE关键字
通过:
cmake -DCMAKE_INSTALL_PREFIX=/usr ..
make
make install
我们就可以将头文件和共享库安装到系统目录/usr/lib和/usr/include/hello中了。
如何使用安装的库?
第一步,指定库文件所在的位置:
INCLUDE_DIRECTORIES([AFTER|BEFORE] [SYSTEM] dir1 dir2 ...)
第二步,将目标文件链接到库:
TARGET_LINK_LIBRARIES(target library1 <debug | optimized> library2 ...)
这个指令可以用来为target添加需要链接的共享库。