背景
文章目录
在Clion中使用STM32的时候,通常把自己开发的内容写在User目录中,然而需要将User目录下的源文件和头文件都添加到生成的
CMakeLits.txt
中。对于不同风格的库,直接在生成的
CMakeLists.txt
中添加资源会显得有些乱,可以使用cmake的**子目录(subdirectory)**解决这个问题。
- Clion下的一个Stm32项目如图所示
配置
在CMake中,通过使用add_subdirectory()命令可以添加子目录。这使得我们可以将项目划分为多个模块,并在每个子目录中管理自己的源文件和构建规则。参考模块化项目管理:CMake中的子目录和模块化构建
只需要在主CMakeLists.txt
中添加(注意如果需要后续使用CubeMX重新生成代码,需要修改CMakeLists_template.txt
),对于以后新的项目,只需要把User目录移动到新目录便可以直接复用以前写的模块,同时尽量不对生成的CMakeLists.txt做过多的修改
......
add_executable(${PROJECT_NAME}.elf ${SOURCES} ${LINKER_SCRIPT})
add_subdirectory(User) # 添加子模块User目录
target_link_libraries(${PROJECT_NAME}.elf User) # 主APP链接User库
set(HEX_FILE ${PROJECT_BINARY_DIR}/${PROJECT_NAME}.hex)
set(BIN_FILE ${PROJECT_BINARY_DIR}/${PROJECT_NAME}.bin)
......
文件目录结构如下,User,Log,EasyLog
目录下均包含一个CMakeLists.txt
文件
- User目录下的CMakeLists.txt中写入
project(User C CXX)
file(GLOB SOURCES "*.c" "*.cc" "*.cpp")
include_directories(Log)
add_library(User STATIC ${SOURCES})
# 添加需要链接的库
add_subdirectory(Log)
target_link_libraries(User Log) # User链接Log库
- Log目录下的CMakeLists.txt中写入
project(Log C CXX)
file(GLOB SOURCES "*.c" "*.cc" "*.cpp")
add_library(Log STATIC ${SOURCES})
# Log依赖的一个开源包
add_subdirectory(EasyLog)
target_link_libraries(Log PUBLIC EasyLog)
- Log的子目录EasyLog的CMakeLists.txt中写入
project(EasyLog C CXX)
file(GLOB_RECURSE SOURCES "*.c" "*.cc" "*.cpp")
add_library(EasyLog STATIC ${SOURCES})
target_include_directories(EasyLog PUBLIC inc)
注意链接库时使用静态库的方式,stm32不支持动态库,将STATIC换成SHARED时编译cmake会出现警告
提示: Clion支持Cmake调试CMake debug | CLion Documentation,使用该功能可能很方便知道Cmake的一些变量信息
项目中使用了多级子目录,使用静态库,编译的时候会先编译静态库.a
再连接
参考源码
zephyrhunt/Stm32H723_Debug: Debug Demo
标签:CMakeLists,Log,subdirectory,Stm32,SOURCES,add,User,txt From: https://blog.csdn.net/qq_47288055/article/details/143259714