什么是CMakeLists:
CMakeLists.txt是CMake构建系统的配置文件,它通过储存项目的构建规则和依赖关系等信息来指导CMake如何生成各种类型的目标文件。这些文件包括可执行文件、静态链接库和动态链接库。
如下是我本人在公司项目下编写的一个基本框架的CMakeLists.txt文件例子:
# 指定CMake的最低版本要求为2.8.12
cmake_minimum_required(VERSION 2.8.12)
# 定义项目名称和版本号
project(MyProject VERSION 1.0)
# 设置变量(设置编译器)
set(CMAKE_C_COMPILER ${TOOLCHAIN_PREFIX}gcc)
set(CMAKE_CXX_COMPILER ${TOOLCHAIN_PREFIX}g++)
# 设置变量(设置编译器的编译标志:以获得更好的性能和更稳定的代码)
# set C_FLAGS_DEBUG
set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -std=gnu99 -o0 -g -ggdb -Werror -Wno-error=format-security")
# set C_FLAGS_RELEASE
set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -std=gnu99 -o3 -Werror -Wno-error=format-security -s ")
# set CXX_FLAGS_DEBUG
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -std=c++11 -o0 -g -ggdb -Werror -Wno-error=format-security")
# set CXX_FLAGS_RELEASE
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -std=c++11 -o3 -Werror -Wno-error=format-security -s ")
# 设置变量(配置CMake构建系统:以获得更好的构建和运行结果)
set(CMAKE_SKIP_BUILD_RPATH FALSE)
set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE) set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) set(CMAKE_POSITION_INDEPENDENT_CODE ON)
# 根据条件判断执行不同的操作
用于设置环境变量LIBSCPI_ROOT的值。如果环境变量LIBSCPI_ROOT未定义,则将其设置为"../scpi-parser",在编译过程中收集"../scpi-parser"目录下的所有C源文件。
LIBSCPI_ROOT:用于指定解析库的根目录路径,如果未定义就自定义为"../scpi-parser",这样在后续构建过程中,CMake可以使用这个路径来查找和链接到SCPI解析器库。
if (NOT DEFINED ENV{LIBSCPI_ROOT})
set(LIBSCPI_ROOT "../scpi-parser")
endif()
如上还可以使用另外一种索引路径的方法,它使用file(GLOB)
命令来查找并收集指定目录下的所有C源文件。在这个例子中,它会在以下目录中查找所有的.c
文件:
file(GLOB SOURCES
"c_driver/src/bus/*
c" "c_driver/src/common/*
c" "c_driver/src/ipcore/*
c" "c_driver/src/mem/*.c")
# 指定头文件的搜索路径
作用是将${LIBSCPI_ROOT}/libscpi/inc
目录添加到编译过程中的包含路径中。这样,编译器就可以在该目录下查找头文件(.h或.hpp文件)进行编译
include_directories(
${LIBSCPI_ROOT}/libscpi/inc
)
如上还可以使用另外一种在目录中找到所需的头文件的方法,就是手动添加一些自己需要的路径进去,用来进行编译
include_directories(
${CMAKE_CURRENT_SOURCE_DIR}/include #当前源代码目录下的
include
子目录/usr/local/include #
/usr/local/include
目录/usr/include #
/usr/include
目录${CMAKE_CURRENT_SOURCE_DIR}/c_driver/include
#当前源代码目录下的
c_driver/include
子目录)
# 将目录中的源文件添加到编译列表中进行编译
LIBSCPI_SOURCE_LIST和SCPI_WRAPPER_SOURCE_LIST是两个变量名,它们通常用于存储编译过程中需要处理的源文件列表:
-
LIBSCPI_SOURCE_LIST:这个变量可能用于存储与
${LIBSCPI_ROOT}/libscpi/src
目录相关的源文件列表。具体含义取决于代码上下文和用途。 -
SCPI_WRAPPER_SOURCE_LIST:这个变量可能用于存储与当前源代码目录下的源文件相关的列表。具体含义取决于代码上下文和用途。
aux_source_directory(${LIBSCPI_ROOT}/libscpi/src LIBSCPI_SOURCE_LIST)
aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR} SCPI_WRAPPER_SOURCE_LIST)
# 设置目标名称
set(TARGET "scpi")
# 将指定的源文件列表添加到目标名称的共享库中
${LIBSCPI_SOURCE_LIST} 和${SCPI_WRAPPER_SOURCE_LIST})是两个变量,分别表示与${LIBSCPI_ROOT}/libscpi/src
目录相关的源文件列表和与当前源代码目录下的源文件相关的列表。
add_library(${TARGET} SHARED ${LIBSCPI_SOURCE_LIST} ${SCPI_WRAPPER_SOURCE_LIST})
# 将动态链接库链接到目标名称中
${CMAKE_DL_LIBS})是一个变量,表示当前系统上可用的动态链接库列表
target_link_libraries(${TARGET} ${CMAKE_DL_LIBS})
如下是代码的截图仅供参考,本人也在学习如何编写CMakeLists.txt,代码是未通过测试的但是方法是ok的,后续会持续更进内容。