TL;DR
如何以优雅的方式与包含的项目级库一起使用CMakeLists.txt?
引言
亲爱的Stack用户,
在我开始手工创建的构建系统(以前使用预先配置的STM32CubeIDE、SW4STM32和MSP430 CCS)之后不久,我通过使用Raspberry RP2040遇到了一个棘手的(主观上)使用CMake的任务。通过大量的教程、提示和问题(以及project生成器),我已经成功地构建了我的简单项目。然而,我觉得这是一种相当临时的方式。
环境
情况如何:我有一个使用RP2040 picoSDK的项目--一个外围配置函数的集合,一个存储在项目目录之外的某种类型的HAL。将picoSDK看作是外部库函数。使用这个picoSDK,我创建了一个使用多个外围设备的简单应用程序。我将我的项目划分为以下结构:项目结构
我的文件之间的连接如下:档案关系,其中我的main.c文件使用一个模块,模块使用两个外围设备。所有这些文件都需要访问全局定义,picoSDK包含在common.h文件中。
为了清晰起见,我在Windows 10上使用VS代码,我正在用arm-gcc 10.3.1编译,我的CMake版本是3.20.6
问题与当前解决方案
现在,我一直在尝试使用这个线程中的其他方法:带有子目录的CMake),在每个目录中使用多个CMakeLists.txt来创建基于o目录的库,然后在顶级CMakeLists.txt中使用add_subdirectory()添加它们,但是没有成功。我所做的工作的CMakeLists.txt以下列方式完成:
cmake_minimum_required(VERSION 3.13)
# [Platfrom specific command] Pull in Raspberry Pi Pico SDK (must be before project)
include(pico_sdk_import.cmake)
project(ProjectName C CXX ASM)
# [Platfrom specific command] Initialize the Raspberry Pi Pico SDK
pico_sdk_init()
set(sources main.c
Common.h
Peripherals/PeripheralA.c
Peripherals/PeripheralA.h
Peripherals/PeripheralB.c
Peripherals/PeripheralB.h
Modules/ModuleSource.c
Modules/ModuleSource.h
Modules/ModuleConfig.h)
# Create executable with specified sources
add_executable(ProjectName ${sources})
# Add the standard library to the build (picoSDK inclusion)
target_link_libraries(ProjectName pico_stdlib)
# Add any user requested libraries (a part of picoSDK)
target_link_libraries( ProjectName
hardware_timer
)免责声明:在特定情况下,添加特定于平台的行,这些问题落入精通RP2040的人手中。
问题是
现在,我觉得嵌入式域有点不同,因为我的项目的每个部分(外设、模块甚至主文件)都需要访问基础:驱动微控制器的库(picoSDK这里),因此我想问:建议的方法是什么,CMakeLists.txt内容的大纲是什么?我确信这个项目会发展壮大,而且根据其他回复,将所有内容都保存在一个CMakeLists.txt文件中是不建议的。
我正在寻找暗示,好的建议和批评。我非常感谢你花了很多时间阅读这篇文章,当然也很感谢你的回复。如果这个问题涉及的是一些琐碎的问题,或者是从熟练用户的角度来说已经没有意义的问题--请接受我的道歉。
发布于 2022-03-06 02:14:25
我能给您的最好的建议是将代码组织到库中。它将使代码解耦,并为单元测试、仿真、代码重用等提供机会。
在外设和模块中,绝对应该避免对common.h的依赖。
下面是一个示例,说明如何创建和链接库彼此以及主项目。
顶层CMakeLists.txt
cmake_minimum_required(VERSION 3.13)
# [Platfrom specific command] Pull in Raspberry Pi Pico SDK (must be before project)
include(pico_sdk_import.cmake)
project(ProjectName C CXX ASM)
# [Platfrom specific command] Initialize the Raspberry Pi Pico SDK
pico_sdk_init()
# Create executable with specified sources
add_executable(ProjectName main.c)
add_subdirectory(Modules)
add_subdirectory(Peripherals)
# Peripherals depend on pico_stdlib only.
target_link_libraries(Peripherals PUBLIC pico_stdlib)
# Modules depend on peripherals only.
target_link_libraries(Modules PUBLIC Peripherals)
# Link direct dependencies of the project.
target_link_libraries(ProjectName
PRIVATE
Modules
hardware_timer
)外围设备/CMakeLists.txt
project(Peripherals)
add_library(${PROJECT_NAME})
target_include_directories(${PROJECT_NAME} ${PROJECT_SOURCE_DIR})
target_sources(${PROJECT_NAME}
PRIVATE
Peripherals/PeripheralA.c
Peripherals/PeripheralA.h
Peripherals/PeripheralB.c
Peripherals/PeripheralB.h
)模块/CMakeLists.txt
project(Modules)
add_library(${PROJECT_NAME})
target_include_directories(${PROJECT_NAME} ${PROJECT_SOURCE_DIR})
target_sources(${PROJECT_NAME}
PRIVATE
Modules/ModuleSource.c
Modules/ModuleSource.h
Modules/ModuleConfig.h
)https://stackoverflow.com/questions/71365643
复制相似问题