cmake 实践
如果只有几个文件,可以直接写Makefile,但是如果工程很大,则cmake省事很多。
1. cmake的Hello world
创建两个文件:main.c CMakeLists.txt(注意文件名大小写,大小写相关)
1)main.c
#include <stdio.h>
int main()
{
printf("hello world!");
return 0;
}
2) CMakeLists.txt
PROJECT(HELLO)
SET(SRC_LIST ./main.c)
MESSAGE(STATUS "This is a BINARY dir " ${HELLO_BINARY_DIR})
ADD_EXECUTABLE(test ${SRC_LIST}) //引用变量用${}, 注意if中不用${}。
然后在文件夹下面执行命令:
cmake .
系统自动生成Makefile,然后make命令即可生成可执行文件test
./test即可运行。
注意:
CMakeLists.txt内容解释:
1)PROJECT(projectname [CXX] [C] [Java])
指定工程名称。指定工程支持的语言,默认支持所有语言。同时隐式的定义了两个cmake变量:
<projectname>_BINARY_DIR 和 <projectname>_SOURCE_DIR.
上面实例中就是:HELLO_BINARY_DIR 和 HELLO_SOURCE_DIR.
小注:cmake系统预定义了PROJECT_BINARY_DIR 和 PROJECT_SOURCE_DIR,跟上面两个内容是一致的,
以后建议直接用PROJECT前缀的,这样即使改变了工程名,也无碍。
2)SET(SRC_LIST main.c t1.c t2.c) //显示定义变量
3)ADD_EXECUTABLE(test ${SRC_LIST}) //定义工程生成一个可执行文件test
小注:参数和变量是大小写相关的。 推荐全部用大写指令,如:ADD_EXECUTABLE、SET、PROJECT等等。
4)工程名HELLO和生成的可执行文件test是没有任何关系的。
5)清理工程:make clean //即可对构建结果进行清理
2. 静态库和动态库的构建
1)mkdir lib; cd lib; touch hello.c hello.h
2)在lib中添加CMakeLists.txt:
SET(LIBHELLO_SRC ./hello.c)
SET(LIBRARY_OUTPUT_PATH /home/qinwg/qinwg/share) //设置lib库输出路径
ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC}) //生成.so
ADD_LIBRARY(hello STATIC ${LIBHELLO_SRC}) //生成.a
不需要写全libhello.so, 只需要写hello即可,cmake自动生成libhello.x
3)安装共享库和头文件
INSTALL(TARGETS hello DESTINATION /home/qinwg/qinwg/share/lib)
INSTALL(FILES hello.h DESTINATION /home/qinwg/qinwg/share/include)
------------------------------------------------------------------
文件夹中操作:
cmake .
make
make install
------------------------------------------------------------------
3. 使用库和头文件
PROJECT(TEST) //测试程序
SET(SRC_LIST ./main.c)
INCLUDE_DIRECTORIES(../include) //INCLUDE_DIRECTORIES包含头文件,让test可以找到头文件hello.h
LINK_DIRECTORIES(../lib) //添加非标准的共享库搜索路径
ADD_EXECUTABLE(test ${SRC_LIST}) //生成可执行文件test
TARGET_LINK_LIBRARIES(test hello) //生成test需要链接hello库
#TARGET_LINK_LIBRARIES(test libhello.a) //链接静态库