CMakeLists.txt 配置文件
🧩 整体结构概览
我们这个 CMakeLists.txt
文件分成以下几个模块:
基本项目信息配置
头文件路径与源文件收集
创建 RTKLIB 动态库
定义函数用于自动添加测试程序
调用函数添加具体测试程序
安装规则
🧱 各区块详解
🔹 1. cmake_minimum_required
+ project
cmake_minimum_required(VERSION 3.16)
project(RTKLIB_Demo)
指定最低 CMake 版本(推荐 3.16+,支持足够多的新特性)
定义当前项目名称
RTKLIB_Demo
🔹 2. 编译选项与平台宏定义
set(CMAKE_C_STANDARD 11) set(CMAKE_C_STANDARD_REQUIRED ON)if(MSVC)add_definitions(-D_CRT_SECURE_NO_WARNINGS -DWIN_DLL) elseif(WIN32)add_definitions(-DWIN_DLL) else()add_definitions(-DDLL) endif()
指定使用 C11 标准
针对不同平台添加编译宏,防止出现一些兼容性警告(如 Windows 下 MSVC 编译器会报
_CRT_SECURE_NO_WARNINGS
)
🔹 3. 设置头文件路径
include_directories(${CMAKE_SOURCE_DIR}${CMAKE_SOURCE_DIR}/src${CMAKE_SOURCE_DIR}/src/rcv )
配置你的源代码和头文件路径,确保
#include "rtklib.h"
等文件可以找到。
🔹 4. 收集源代码文件
file(GLOB_RECURSE SOURCES${CMAKE_SOURCE_DIR}/src/*.c${CMAKE_SOURCE_DIR}/src/rcv/*.c )
自动搜索
src/
和src/rcv/
下的所有.c
文件。这些文件用于构建主库
rtklib
。
message(STATUS "==== 源文件列表 ====")
打印收集到的源文件到终端,便于调试路径是否正确。
🔹 5. 构建动态库 rtklib
add_library(rtklib SHARED ${SOURCES})
将 RTKLIB 构建为动态库(
.dll
或.so
),你可以根据需要改成STATIC
。
target_link_libraries(rtklib PRIVATE ws2_32 winmm wsock32)
链接系统底层库,例如网络和多媒体相关库。
🔹 6. 函数:添加测试程序 add_test_executable
function(add_test_executable test_name)... endfunction()
这个函数是关键,专门用于添加测试程序,比如:
add_test_executable(test_eph)
做的事包括:
步骤 | 功能 |
---|---|
查找源文件 | ${PROJECT_SOURCE_DIR}/test/${test_name}.c |
判断是否存在 | 如果存在就 add_executable() |
设置头文件路径 | 保证测试程序也能访问 rtklib.h |
链接动态库 | target_link_libraries() 链接 rtklib |
拷贝测试数据 | test_eph 额外拷贝 data/result/ 到 bin/data |
设置输出位置 | 设置 .exe 输出到 bin/ |
🔹 7. 添加测试程序调用(主动调用)
add_test_executable(test_eph) add_test_executable(test_doublediff)
只需要调用上面的函数名加测试文件名就可以了。你可以继续添加其他测试程序,例如:
add_test_executable(test_baseline) add_test_executable(test_ambiguity)
只要 test/
文件夹下有对应的 .c
文件即可。
🔹 8. 安装规则(非必须)
install(TARGETS rtklib RUNTIME DESTINATION lib)
这是用于 cmake --install .
时将生成的库文件复制到安装目录(一般用于部署时用)。
🆕 如何添加一个新的测试程序?
📁 示例:你要添加 test_rtkpos.c
将文件放入
test/
目录test/ └── test_rtkpos.c
在
CMakeLists.txt
最后添加:add_test_executable(test_rtkpos)
重新构建:
cd build cmake .. cmake --build .
你将在
bin/test_rtkpos.exe
中看到生成结果。
✅ 总结:一图胜千言
CMakeLists.txt ├─ 设定项目与平台配置 ├─ include_directories # 包含头文件路径 ├─ file(GLOB ...) # 收集源文件 ├─ add_library(rtklib) # 构建主库 ├─ function(add_test_...) # 通用测试添加函数 ├─ add_test_executable(...) # 添加实际测试程序 └─ install(...) # 安装规则(可选)
附上整个配置代码:
cmake_minimum_required(VERSION 3.16)
project(RTKLIB_Demo)
# 使用 C11 标准
set(CMAKE_C_STANDARD 11)
set(CMAKE_C_STANDARD_REQUIRED ON)
# 设置可执行文件和库的输出目录
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/bin)
set(LIBRARY_OUTPUT_PATH ${CMAKE_SOURCE_DIR}/lib)
# 平台定义宏
if(MSVC)
add_definitions(-D_CRT_SECURE_NO_WARNINGS -DWIN_DLL)
elseif(WIN32)
add_definitions(-DWIN_DLL)
else()
add_definitions(-DDLL)
endif()
# 头文件包含路径
include_directories(
${CMAKE_SOURCE_DIR}
${CMAKE_SOURCE_DIR}/src
${CMAKE_SOURCE_DIR}/src/rcv
)
# 收集源文件(不包含 test/ 文件夹)
file(GLOB_RECURSE SOURCES
${CMAKE_SOURCE_DIR}/src/*.c
${CMAKE_SOURCE_DIR}/src/rcv/*.c
)
# 输出源文件调试信息
message(STATUS "==== 源文件列表 ====")
foreach(src ${SOURCES})
message(STATUS " ${src}")
endforeach()
# 创建 rtklib 动态库(也可以改成 STATIC)
add_library(rtklib SHARED ${SOURCES})
# 链接系统库
if(WIN32)
target_link_libraries(rtklib PRIVATE ws2_32 winmm wsock32)
else()
target_link_libraries(rtklib PRIVATE m pthread)
endif()
# ==== 函数:添加测试程序 ====
function(add_test_executable test_name)
set(TEST_SRC ${CMAKE_SOURCE_DIR}/test/${test_name}.c)
message(STATUS "尝试添加测试程序: ${test_name} -> ${TEST_SRC}")
if(EXISTS ${TEST_SRC})
message(STATUS "✔ 添加测试程序: ${test_name}")
add_executable(${test_name} ${TEST_SRC})
target_include_directories(${test_name} PRIVATE
${CMAKE_SOURCE_DIR}
${CMAKE_SOURCE_DIR}/src
${CMAKE_SOURCE_DIR}/src/rcv
)
target_link_libraries(${test_name} PRIVATE rtklib)
if(WIN32)
target_link_libraries(${test_name} PRIVATE ws2_32 winmm)
else()
target_link_libraries(${test_name} PRIVATE m)
endif()
set_target_properties(${test_name} PROPERTIES
RUNTIME_OUTPUT_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}
)
# 安装测试程序
install(TARGETS ${test_name} RUNTIME DESTINATION bin)
# 拷贝测试数据(仅 test_eph 需要)
if(${test_name} STREQUAL "test_eph")
add_custom_command(TARGET ${test_name} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/data
COMMAND ${CMAKE_COMMAND} -E copy_directory
${CMAKE_SOURCE_DIR}/data/result
${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/data
COMMENT "📦 拷贝 test_eph 所需测试数据"
)
endif()
else()
message(WARNING "⚠ 未找到测试程序 ${test_name} 源文件:${TEST_SRC}")
endif()
endfunction()
# ==== 添加测试程序 ====
add_test_executable(test_eph)
add_test_executable(test_doublediff)
# 安装库
install(TARGETS rtklib RUNTIME DESTINATION lib)