cmake使用记录
Android相关
- 编译一个动态库,到指定的目录
cmake_minimum_required(VERSION 3.22.1)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../v2x_algo_output/${ANDROID_ABI})
project("serial_port")
include_directories(include)
add_library(${CMAKE_PROJECT_NAME} SHARED# List C/C++ source files with relative paths to this CMakeLists.txt.SerialPort.c)
target_link_libraries(${CMAKE_PROJECT_NAME}# List libraries link to the target libraryandroidlog)
- 编译一个动态库,并且链接其他第三方so库。
# Sets the minimum CMake version required for this project.
cmake_minimum_required(VERSION 3.22.1)project("v2x_bus_module")set(adapter "bus_adapter")include_directories(include)#build/intermediates/cxx/Debug/6u666712/obj/arm64-v8a/libalgo.sofind_library( # Sets the name of the path variable.log-lib# Specifies the name of the NDK library that# you want CMake to locate.log)add_library(${adapter} SHARED# List C/C++ source files with relative paths to this CMakeLists.txt.JniLoader.cppCarV2xService.cppBusCallbackThread.cppBusServiceContext.cpp)add_library(algoSHAREDIMPORTED)set_target_properties(algoPROPERTIESIMPORTED_LOCATION${CMAKE_CURRENT_SOURCE_DIR}/libs/libalgo.so)target_link_libraries(${adapter}algo# List libraries link to the target libraryandroid${log-lib})
Linux相关
- 对外释放SDK的cmake,包含安装第三方库,然后内部配置。
cmake_minimum_required(VERSION 3.25)
project(TrafficSignalSDK)set(CMAKE_CXX_STANDARD 14)set(PROJECT_ROOT ${CMAKE_CURRENT_SOURCE_DIR})# 添加库
add_library(TrafficSignalSDK SHAREDsrc/TrafficSignalSDKImpl.cpp)set_target_properties(TrafficSignalSDK PROPERTIES VERSION 1.0 SOVERSION 1)# 设置库的输出目录
set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/gic_libs)add_definitions(-DGLOG_USE_GLOG_EXPORT)# 头文件目录配置
target_include_directories(TrafficSignalSDKPUBLIC${PROJECT_ROOT}/include # 公共头文件,供客户和库内部使用${PROJECT_ROOT}/third_party/cjson # 第三方头文件,供客户和库内部使用${PROJECT_ROOT}/third_party/glog_dir/include$<INSTALL_INTERFACE:include> # 安装阶段后的头文件路径名称PRIVATE${PROJECT_ROOT}/src/include # 内部头文件,仅供库内部使用)# 链接第三方库(
target_link_libraries(TrafficSignalSDK${PROJECT_ROOT}/third_party/glog_dir/lib/libglog.so# 如果有其他第三方库,继续添加)# 安装公共头文件(包括第三方头文件)
install(DIRECTORY ${PROJECT_ROOT}/include/ DESTINATION includeFILES_MATCHING PATTERN "*.h")install(DIRECTORY ${PROJECT_ROOT}/third_party/cjson DESTINATION includeFILES_MATCHING PATTERN "*.h")install(DIRECTORY ${PROJECT_ROOT}/third_party/glog_dir/include/glog DESTINATION includeFILES_MATCHING PATTERN "*.h")# 安装库文件
install(TARGETS TrafficSignalSDKLIBRARY DESTINATION libARCHIVE DESTINATION libRUNTIME DESTINATION bin)#第三方库安装
install(FILES ${PROJECT_ROOT}/third_party/glog_dir/lib/libglog.so.0.7.1 DESTINATION lib)#可执行的bin文件
#add_executable(TrafficSignalSDK main.cpp include/CloudTrafficLightData.h include/TrafficSignalSDK.h src/TrafficSignalSDKImpl.cpp src/TrafficSignalSDKImpl.h)
记录
set_target_properties(animals
PROPERTIES
CXX_STANDARD 14
CXX_EXTENSIONS OFF
CXX_STANDARD_REQUIRED ON
POSITION_INDEPENDENT_CODE 1
)
- CXX_STANDARD会设置我们想要的标准。
- CXX_EXTENSIONS告诉CMake,只启用 ISO C++ 标准的编译器标志,而 不使用特定编译器的扩展。
- CXX_STANDARD_REQUIRED指定所选标准的版本。如果这个版本不可 用,CMake将停止配置并出现错误。当这个属性被设置为OFF 时,CMake 将寻找下一个标准的最新版本,直到一个合适的标志。这意味着,首先查找C++20 ,然后是 C++17 ,然后是 C++14 。
生成一个源文件列表
list(
APPEND sources_with_lower_optimization
geometry_circle.cpp
geometry_rhombus.cpp
)
foreach() 的四种使用方式:
-
foreach(loop_var arg1 arg2 …) : 其中提供循环变量和显式项列表。当为 sources_with_lower_optimization 中的项打印编译器标志集时,使用此表单。注意,如果项目列表位于变量中,则必须显式展开它;也就是说,${sources_with_lower_optimization} 必须作为参数传递。
-
通过指定一个范围,可以对整数进行循环,例如: foreach(loop_var range total) 或 foreach(loop_var range start stop [step]) 。
-
对列表值变量的循环,例如: foreach(loop_var IN LISTS [list1[…]])
。参数解释为列表,其内容就会自动展开。 -
对变量的循环,例如: foreach(loop_var IN ITEMS [item1 […]]) 。参数
的内容没有展开。
set_source_files_properties(file PROPERTIES property value)
它将属性设置为给定文件的传递值。与目标非常相似,文件在CMake中也有属性,允许对构建系统进行非常细粒度的控制。源文件的可用属性列表可以在这里找到: https://cmake.org/cmake/help/v3.5/manual/cmakeproperties.7.html#source-file-properties 。
get_source_file_property(VAR file property) ,检索给定文件所需属性
的值,并将其存储在CMake VAR 变量中。
检查系统
if(CMAKE_SYSTEM_NAME STREQUAL “Linux”)
message(STATUS “Configuring on/for Linux”)
处理与平台相关的源代码
代码中可以编写:
std::string say_hello() {
#ifdef IS_WINDOWS
return std::string("Hello from Windows!");
#elif IS_LINUX
return std::string("Hello from Linux!");
cmake中可以编写
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
target_compile_definitions(hello-world PUBLIC "IS_LINUX")
endif()
CMake的 CMAKE_SIZEOF_VOID_P 变量会告诉我们CPU是32位还是64位。
CMake定义了 CMAKE_HOST_SYSTEM_PROCESSOR 变量,以包含当前运行的处理器的名称。
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
target_compile_definitions(arch-dependent PUBLIC "IS_64_BIT_AR
CH")
message(STATUS "Target is 64 bits")
else()
target_compile_definitions(arch-dependent PUBLIC "IS_32_BIT_AR
CH")
message(STATUS "Target is 32 bits")
endif()
cmake检查外部的环境
- find_file:在相应路径下查找命名文件
- find_library:查找一个库文件
- find_package:从外部项目查找和加载设置
- find_path:查找包含指定文件的目录
- find_program:找到一个可执行程序
- 找到Python解释器。这是一个 REQUIRED 依赖:
find_package(PythonInterp REQUIRED)