当前位置: 首页 > ds >正文

CMakeLists.txt 配置文件

🧩 整体结构概览

我们这个 CMakeLists.txt 文件分成以下几个模块:

  1. 基本项目信息配置

  2. 头文件路径与源文件收集

  3. 创建 RTKLIB 动态库

  4. 定义函数用于自动添加测试程序

  5. 调用函数添加具体测试程序

  6. 安装规则


🧱 各区块详解

🔹 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

  1. 将文件放入 test/ 目录

    test/
    └── test_rtkpos.c
    
  2. CMakeLists.txt 最后添加:

    add_test_executable(test_rtkpos)
    
  3. 重新构建:

    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)

http://www.xdnf.cn/news/15862.html

相关文章:

  • 非线性优化相关库笔记
  • 【面试题】大厂高压面经实录丨第二期
  • @Qualifier(“beanName“) 详解
  • 一个逻辑问题
  • 《设计模式之禅》笔记摘录 - 8.命令模式
  • Day06_C语言网络编程20250718mobus重点
  • gin数据解析和绑定
  • 门控线性单元GLU (Gated Linear Unit)
  • Go语言流程控制(if / for)
  • 一小时学习Redis
  • websocket案例 599足球比分
  • 海森矩阵(Hessian Matrix)在SLAM图优化和点云配准中的应用介绍
  • 实战指南|智慧无人机安防系统搭建全流程解析
  • 深入理解Linux文件操作:stdin/stdout/stderr与C语言文件函数全解析
  • PDF 拆分合并PDFSam:开源免费 多文件合并 + 按页码拆分 本地处理
  • 突破性量子芯片问世:电子与光子首次集成,开启量子技术规模化应用新篇章
  • 暑期自学嵌入式——Day05补充(C语言阶段)
  • 二分答案之第 K 小/大
  • Visual Studio编译WPF项目生成的文件介绍
  • 服务器mysql数据的简单备份脚本
  • 二、Dify 版本升级教程(LInux-openeuler)
  • iOS OC 图片压缩
  • vue2 面试题及详细答案150道(101 - 120)
  • 国产替代:ASP4644在电信通信设备中的测试与应用前景
  • Java类:BigDecimal 的用法:乘法
  • IDEA 2020.1版本起下载JDK
  • Logback 配置的利器:深入理解<property>与<variable>
  • vue2 面试题及详细答案150道(21 - 40)
  • 闭包的定义和应用场景
  • Rust实战:高效对接Postman API