官网cmd介绍:
cmake-commands(7) — CMake 3.22.6 Documentation
CMake中一切都是基于target的,如add_library
会产生一个library的target,add_executable
会产生一个exe的target。
编写CMakeLists.txt最常用的功能就是调用其他的.h头文件和.so/.a库文件,将.cpp/.c/.cc文件编译成可执行文件或者新的库文件。
外部项目构建(自定义项目)
目录框架:
之后在build文件下执行 cmake ..; make
mi@mi-OptiPlex-7080:~/桌面/test/build$ cmake ..
-- The C compiler identification is GNU 7.5.0
-- The CXX compiler identification is GNU 7.5.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/mi/桌面/test/build
mi@mi-OptiPlex-7080:~/桌面/test/build$ make
Scanning dependencies of target testdemo
[ 50%] Building CXX object CMakeFiles/testdemo.dir/src/hello.cpp.o
[100%] Linking CXX executable testdemo
[100%] Built target testdemo
然后目录结果如下:
CMakeLists.txt如下
cmake_minimum_required(VERSION 3.10.2) #CMake最低版本号要求
project(testdemo) #设置项目名称
#########
#通过设置CMAKE_BUILD_TYPE 生成debug或者release版本的程序,根据设置的类型,选择**_FLAGS_DEBUG或者**_FLAGS_RELEASE作为编译选项生成Makefile
#set(CMAKE_BUILD_TYPE "Debug")
#set(CMAKE_BUILD_TYPE "Release")
SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb")#编译成debug版本,这些都是gcc的编译选项。-O指定优化等级,-g -ggdb表示带上调试信息
SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")#编译成release版本,-Wall是开启所有编译警告
##################
include_directories (src/) #添加头文件搜索目录
#add_subdirectory(math) #添加子目录,调用子目录的CMakeLists.txt
#可执行文件的路径和名称可以通过RUNTIME_OUTPUT_DIRECTORY和OUTPUT_NAME两个property来控制。这两个属性默认为空。
#set_target_properties(${PROJECT_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "abc/")#自定义可执行文件的路径
#set_target_properties(${PROJECT_NAME} PROPERTIES OUTPUT_NAME "abcde")#自定义可执行文件名称
#get_target_properties(output-dir ${PROJECT_NAME} RUNTIME_OUTPUT_DIRECTORY)
#get_target_properties(output-name ${PROJECT_NAME} OUTPUT_NAME)#获取系统变量值
message("output-dir:::---${output-dir}")
message("output-name::----${output-name}")#打印变量
#add_custom_target会根据命令的参数生成一个target,这个target相对的可以更定制化一点
add_custom_target(
print-pwd
#ALL #add_custom_target的target则是默认不在all target中。所有在声明target的时候,可以加上ALL,这个target就会加入all target中,否则make之后,是没有任何反应的
COMMAND "pwd"#COMMAND中的命令和参数是分开的
)
#artget之间可以有依赖关系,A依赖B(A depends on B),意味着A的build,需要基于B 已经build完成。要实现A依赖B,则要在定义A的时候,加上DEPENDS B。
add_custom_target(
depend-print-pwd
#ALL
COMMAND "echo" "depend pwd"
DEPENDS print-pwd
)
add_executable(${PROJECT_NAME} src/hello.cpp) #产生一个exe的target
#add_library作用就是将指定的源文件生成链接文件,然后添加到工程中去,实际就是产生一个library的target
#add_library(mytestlibhello SHARED src/hello.cpp)
#作用主要是指定要链接的库文件的路径,该指令有时候不一定需要。因为find_package和find_library指令可以得到库文件的绝对路径
#link_directories(
# lib
#)
#target_link_libraries作用为将动态库library链接到目标
#target_link_libraries(${PROJECT_NAME} libmytestlibhello)
#target_link_libraries (${PROJECT_NAME} pthread)
#target_link_libraries (${PROJECT_NAME} log)
install (TARGETS ${PROJECT_NAME} RUNTIME DESTINATION bin)
cmake入门精华专栏:
https://blog.csdn.net/handsomehong/category_10557493.html
CMake编译工程/第一个CMakeLists.txt(最详细案例演示)_芯辰大海的博客-CSDN博客_cmakelists.txt 教程
CMakeLists.txt(ROS) - TNTksals - 博客园
(转)HelloWorld CMake CMake中构建静态库与动态库及其使用 - 莫水千流 - 博客园
【CMake】CMakeLists.txt的超傻瓜手把手教程(附实例源码)_Yngz_Miao的博客-CSDN博客_cmakelists.txt怎么用
======================================================