【cmake】cmakeList.txt常用命令逐语句分析

1.设置工程名


//这里${PROJECT_NAME} 变量是最近一次使用project()时进行的赋值,其后添加了若干源文件:
add_executable(${PROJECT_NAME} 
	main.c 
	testFunc.c
	testFunc1.c
	testFunc2.c
	testFunc3.c
	)

2.当有多个源文件时,使用自动检索

//第一个参数是输入,检索目录,第二个参数作为输出
 aux_source_directory(dir var)
//最后添加可执行文件:
add_executable(${PROJECT_NAME} 
${var})

3.变量设置,相等于程序里的=号

set( SOURCES
	 ./main.c
	 ./testFunc1.c
	 ./testFunc.c)

4.使用include加入头文件搜索路径


project (demo)
//# 向工程添加多个指定头文件的搜索路径,路径之间用空格分隔,这里的test_func,test_func1 为文件夹名,这个include_directories的命令,其实相当于使各cpp文件中引用的头文件,不用加相对路径,使得.h文件被引用时,不必受路径困扰
include_directories (test_func test_func1)
//#使用aux_source_directory把当前目录下的源文件存列表存放到变量SRC_LIST里
aux_source_directory (test_func SRC_LIST)
aux_source_directory (test_func1 SRC_LIST1)
add_executable (${PROJECT_NAME} main.c ${SRC_LIST} ${SRC_LIST1})

5.使用target_include_directories

//使用target_include_directories,PRIVATE表示范围,PROJECT_SOURCE_DIR为包含project()中最近一个cmakelist.txt的范围,这里没有把.h文件显示包含进去,因为当编译.c文件时,会自动把.h文件包含在内,相当于间接添加了.h文件,如果.h文件搜索路径已经被包含了。
cmake_minimum_required (VERSION 2.8)
project (demo)
set(SOURCES
        src/testFunc.c
        src/testFunc1.c
        src/main.c
        )
add_executable(${PROJECT_NAME} ${SOURCES})
target_include_directories(${PROJECT_NAME}
        PRIVATE
        ${PROJECT_SOURCE_DIR}/include
        )
//PROJECT_SOURCE_DIR为包含PROJECT ()的最近一个CMakeLists.txt文件所在的文件夹。

6.添加子文件夹的命令(能够适应生成多个exe的情况)

```

cmake_minimum_required (VERSION 2.8)
project (demo)
add_subdirectory (src)

//src/CMakeLists.txt 内容如下,这里是转至src/CMakeLists.txt继续运行

include_directories (${PROJECT_SOURCE_DIR}/include)
aux_source_directory (. SOURCES)
add_executable (${PROJECT_NAME}  ${SOURCES})

//这里设置了可执行文件的输出路径信息:
set (EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)

7.消息输出

/*
 (无) = 重要消息;
 STATUS = 非重要消息;
 WARNING = CMake 警告, 会继续执行;
 AUTHOR_WARNING = CMake 警告 (dev), 会继续执行;
 SEND_ERROR = CMake 错误, 继续执行,但是会跳过生成的步骤;
 FATAL_ERROR = CMake 错误, 终止所有处理过程;
*/
SET(USER_KEY "Hello World")
MESSAGE( STATUS "this var key = ${USER_KEY}.")

在这里插入图片描述

8.编译一个静态库,供给可执行程序使用

cmake_minimum_required(VERSION 3.5)

project(hello_library)

//指定一个静态库输出,名字为hello_library,这里不加STATIC默认就是静态库
add_library(hello_library STATIC
        src/hello.cpp
        )
/*
它让 CMake 知道链接到此库的任何目标也自动包含目录。这是对于库的常见设置
*/
target_include_directories(hello_library
        PUBLIC
        ${PROJECT_SOURCE_DIR}/include
        )

# Add an executable with the above sources
add_executable(hello_binary
        src/main.cpp
        )

# link the new hello_library target with the hello_binary target
//这里的PRIVATE含义是,hello_binary自己引用hello_library.a,但是该库的函数,不暴露给其它调用hello_binary的调用者。如果有第三方执行程序想链接hello_binary,也要同时链接hello_library.a,不然hello_binary会报找不到符号的错误。
target_link_libraries(hello_binary
        PRIVATE
        hello_library
        )

9.生成动态库


cmake_minimum_required(VERSION 3.5)

project(hello_library)

############################################################
# Create a library
############################################################

//这里是动态库的标志
add_library(hello_library SHARED 
    src/Hello.cpp
)
//ALIAS别名,给生成的库取一个别名,可供下文进行链接使用
add_library(hello::library ALIAS hello_library)

target_include_directories(hello_library
    PUBLIC 
        ${PROJECT_SOURCE_DIR}/include
)

############################################################
# Create an executable
############################################################

# Add an executable with the above sources
add_executable(hello_binary
    src/main.cpp
)

# link the new hello_library target with the hello_binary target
target_link_libraries(hello_binary
    PRIVATE 
        hello::library
)

10.修改生成库的名字,并修改生成路径


aux_source_directory (. SRC_LIST)

//使用${SRC_LIST}为原材料生成一个叫做testFunc_shared 的动态库
add_library (testFunc_shared SHARED ${SRC_LIST})
//使用${SRC_LIST}为原材料生成一个叫做testFunc_static 的静态库
add_library (testFunc_static STATIC ${SRC_LIST})

//将testFunc_shared 重新命名为 libtestFunc.so
set_target_properties (testFunc_shared PROPERTIES OUTPUT_NAME "testFunc")
//将testFunc_static  重新命名为 libtestFunc.a
set_target_properties (testFunc_static PROPERTIES OUTPUT_NAME "testFunc")

//设置 库文件的默认输出路径
set (LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)

11.生成各类文件的安装


//cmake提供了添加make install目标的功能,以允许用户安装二进制文件、库和其他文件,其实就是将生成的文件复制到指定目录,基本安装位置由变量CMAKE_INSTALL_PREFIX控制
cmake_minimum_required(VERSION 3.5)

project(cmake_examples_install)

############################################################
# Create a library
############################################################

#Generate the shared library from the library sources
add_library(cmake_examples_inst SHARED
        src/hello.cpp
        )

target_include_directories(cmake_examples_inst
        PUBLIC
        ${PROJECT_SOURCE_DIR}/include
        )

############################################################
# Create an executable
############################################################

# Add an executable with the above sources
add_executable(cmake_examples_inst_bin
        src/main.cpp
        )

# link the new hello_library target with the hello_binary target
target_link_libraries( cmake_examples_inst_bin
        PRIVATE
        cmake_examples_inst
        )

############################################################
# Install
############################################################

//使用了TARGETS及DESTINATION指定要安装的变量及安装到的位置${CMAKE_INSTALL_PREFIX}/bin
install (TARGETS cmake_examples_inst_bin
        DESTINATION bin)

//生成的库移动,windows下的dll在使用runtime时被构建
install (TARGETS cmake_examples_inst
        LIBRARY DESTINATION lib)

//文件夹下头文件的移动,其实是移动目录下的所有文件
install(DIRECTORY ${PROJECT_SOURCE_DIR}/include/
        DESTINATION include)

//配置文件移动
install (FILES cmake-examples.conf
        DESTINATION etc)
//一次安装多个目标        
INSTALL(TARGETS myrun mylib mystaticlib
RUNTIME DESTINATION bin
LIBRARY DESTINATION lib
ARCHIVE DESTINATION libstatic)

//上面的例子会将:
//可执行二进制myrun 安装到${CMAKE_INSTALL_PREFIX}/bin 目录
//动态库libmylib安装到${CMAKE_INSTALL_PREFIX}/lib目录
//静态库libmystaticlib 安装到${CMAKE_INSTALL_PREFIX}/libstatic目录//
//更改默认的安装根目录:初始化目录为/usr/local/
set(CMAKE_INSTALL_PREFIX "${CMAKE_BINARY_DIR}/install")


12.添加第三方库


//Cmake中一个自动寻找函数find_package()可以帮我们实现这个功能。
//find_package()函数将从CMAKE_MODULE_PATH中的文件夹列表中搜索格式为FindXXX.cmake的CMake模块。
//CMAKE_MODULE_PATH,CMAKE_PREFIX_PATH是以分号分隔的列表,供find_package(), find_program(), find_library(), find_file()和find_path()使用,初始为空,由用户设定
//Boost -库的名称。这是用于查找模块文件FindBoost.cmake的一部分。
//1.46.1 - 要查找的Boost的最低版本。
//REQUIRED - 告诉模块这是必需的,如果失败,则编译通不过。
//COMPONENTS - 要查找的库列表。
cmake_minimum_required(VERSION 3.5)

# Set the project name
project (third_party_include)


// 找到 boost 安装里面的filesystem 和 system 库
find_package(Boost 1.46.1 REQUIRED COMPONENTS filesystem system)

# check if boost was found
if(Boost_FOUND)
    message ("boost found")
    //找到包时导出的变量
    include_directories(${Boost_INCLUDE_DIRS})
else()
    message (FATAL_ERROR "Cannot find Boost")
endif()

//添加可执行程序
add_executable(${PROJECT_NAME} main.cpp)

# link against the boost libraries
target_link_libraries( ${PROJECT_NAME}
    PRIVATE
        Boost::filesystem
)

//找到库后,导出的目标分别有:
//xxx_INCLUDE_DIRS - 指向库的include目录的变量
//xxx_LIBRARY - 指向库路径的变量.
# Include the boost headers
target_include_directories( third_party_include
    PRIVATE ${Boost_INCLUDE_DIRS}
)

# link against the boost libraries
target_link_libraries( third_party_include
    PRIVATE
    ${Boost_SYSTEM_LIBRARY}
    ${Boost_FILESYSTEM_LIBRARY}
)

//qt的例子
find_package(Qt5 5.1.0 COMPONENTS Widgets Xml Sql)
//cmake本身不提供任何搜索库的便捷方法,所有搜索库并给变量赋值的操作必须由cmake代码完成,比如FindXXX.cmake和//XXXConfig.cmake。只不过,库的作者通常会提供这两个文件,以方便使用者调用。通常记录在FindXXX.cmake文件的顶部
//没有相关库时,人工赋值
SET(LAPACK_DIR /usr/local/lib/) 
SET(LAPACK_INCLUDE_DIRS /usr/local/include) 
SET(LAPACK_LIBRARIES /usr/local/lib)

13.操作系统类型检查

# -----------------------------------------------------------------------------
# O/S Detection

# these are defined in common.h too
SET(LINUX   False)
SET(FREEBSD False)
SET(MACOS   False)

# Detect the operating system
IF(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
    SET(TARGET_OS_NAME "macos")
    SET(TARGET_OS 3)
    SET(MACOS True)
ELSEIF(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD")
    SET(TARGET_OS_NAME "freebsd")
    SET(TARGET_OS 2)
    SET(FREEBSD True)
ELSE()
    SET(TARGET_OS_NAME "linux")
    SET(TARGET_OS 1)
    SET(LINUX True)
ENDIF()

# show the operating system on the console
message(STATUS "operating system: ${TARGET_OS_NAME} (TARGET_OS=${TARGET_OS})")

14.设置c++标准

cmake_minimum_required(VERSION 3.1)
//设置项目名
project (hello_cpp11)
//设置c++标准
set(CMAKE_CXX_STANDARD 11)
//添加可执行文件
add_executable(${PROJECT_NAME} main.cpp)
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

颢师傅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值