最近用了一下cmake,虽然还不熟练,但是感觉比Makefile更简单,并且是跨平台的。
这里大概总结一下常用语法。
首先,cmake
命令可以全大写或者全小写。
//test.cpp
#include <stdio.h>
int main()
{
printf("hello CMakeLists\n");
return 0;
}
编写CMakeLists.txt
# CMake 最低版本号要求
cmake_minimum_required (VERSION 2.8)
# 项目信息
project (test)
# 查找当前目录下的所有源文件
# 并将名称保存到 DIR_SRCS 变量
aux_source_directory(. DIR_SRCS)
# 指定生成目标
add_executable(test ${DIR_SRCS})
编译
mkdir build
cd build
cmake ..
make
//testlib.cpp
int add(int a, int b)
{
return a+b;
}
# CMake 最低版本号要求
cmake_minimum_required (VERSION 2.8)
# 项目信息
project (testlib)
# 查找当前目录下的所有源文件
# 并将名称保存到 DIR_SRCS 变量
aux_source_directory(. DIR_SRCS)
# 指定生成目标
add_library(testlib STATIC ${DIR_SRCS})
➜ build make
Scanning dependencies of target testlib
[ 50%] Building CXX object CMakeFiles/testlib.dir/testlib.cpp.o
[100%] Linking CXX static library libtestlib.a
[100%] Built target testlib
链接静态库
//test.cpp
#include <stdio.h>
int add(int a, int b);
int main()
{
printf("1 + 2 = %d\n", add(1, 2));
return 0;
}
# CMake 最低版本号要求
cmake_minimum_required (VERSION 2.8)
# 项目信息
project (test)
# 查找当前目录下的所有源文件
# 并将名称保存到 DIR_SRCS 变量
aux_source_directory(. DIR_SRCS)
# 指定生成目标
add_executable(test ${DIR_SRCS})
find_library(
TESTLIB testlib
PATHS ./build)
message(${TESTLIB})
target_link_libraries (test ${TESTLIB})
# CMake 最低版本号要求
cmake_minimum_required (VERSION 2.8)
# 项目信息
project (testlib)
# 查找当前目录下的所有源文件
# 并将名称保存到 DIR_SRCS 变量
aux_source_directory(. DIR_SRCS)
# 指定生成目标
add_library(testlib SHARED ${DIR_SRCS})
[ 33%] Building CXX object CMakeFiles/testlib.dir/test.cpp.o
[ 66%] Building CXX object CMakeFiles/testlib.dir/testlib.cpp.o
[100%] Linking CXX shared library libtestlib.so
[100%] Built target testlib
# 指定 编译目标 的安装路径
install (TARGETS test DESTINATION bin)
make install
include_directories:指定头文件的搜索路径,相当于指定gcc的-I参数
>> include_directories (${HELLO_SOURCE_DIR}/Hello) #增加Hello为include目录
link_directories:动态链接库或静态链接库的搜索路径,相当于gcc的-L参数
>> link_directories (${HELLO_BINARY_DIR}/Hello) #增加Hello为link目录
add_subdirectory:包含子目录
>> add_subdirectory (Hello)
add_executable:编译可执行程序,指定编译,好像也可以添加.o文件
>> add_executable (helloDemo demo.cxx demo_b.cxx) #将cxx编译成可执行文件——
add_custom_target:
message( status|fatal_error, “message”):
set_target_properties( ... ): lots of properties... OUTPUT_NAME, VERSION, ....
link_libraries( lib1 lib2 ...): All targets link with the same set of libs
set environment variable,设置环境变量,编译用到的源文件全部都要放到这里,否则编译能够通过,但是执行的时候会出现各种问题,比如"symbol lookup error xxxxx , undefined symbol"
SET(TEST_MATH
${DIR_SRCS}
)
https://www.jianshu.com/p/5a63414f0691
https://www.cnblogs.com/cv-pr/p/6206921.html
https://www.cnblogs.com/lidabo/p/7359422.html
https://www.hahack.com/codes/cmake/