长亭百川云 - 文章详情

「日记」CMakeLists使用笔记

汉客儿安全笔记

39

2024-07-13

最近用了一下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/

相关推荐
关注或联系我们
添加百川云公众号,移动管理云安全产品
咨询热线:
4000-327-707
百川公众号
百川公众号
百川云客服
百川云客服

Copyright ©2024 北京长亭科技有限公司
icon
京ICP备 2024055124号-2