我有一个CMake项目,用于交叉编译STM32的可执行文件。项目结构包括用于所需各种依赖项的文件夹,这些文件夹中包含源文件和头文件。建立项目的CMakeLists.txt文件就像设置交叉编译一样简单,然后glob
将来自每个依赖项和用户代码的源代码放在一起,然后使用{{1}设置所有标头的位置}。最后,include_directories
用于组合所有内容并构建二进制文件。
我意识到,这可能不是执行此操作的最佳方法(应该将deps构建为库),但目前确实有效。
该问题来自具有许多子目录(lwIP)层的dep,并且源文件和头文件包含include语句,这些语句引用该dep中子目录的级别。例如,lwIP文件结构如下:
add_executable
lwIP源文件(或头文件!)可能包含“ lwip / err.h”。当然,preproc无法找到此文件,因为相对路径对此文件没有意义。
我应该如何配置该项目,以便可以在不修改源文件或头文件的情况下使用这些包含项?
答案 0 :(得分:0)
解决此问题的常用方法是创建自己的查找模块,即FindXXX.cmake
(在您的情况下为FindLwIP.cmake
),以便您可以在包中创建LwIP_INCLUDE_DIRS
变量
set(LwIP_INCLUDE_DIRS
${CMAKE_CURRENT_LIST_DIR}/../LwIP/include
${CMAKE_CURRENT_LIST_DIR}/../LwIP
${CMAKE_CURRENT_LIST_DIR}/../LwIP/include/XXX)
.
.
(omitted..)
.
.
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(LwIP DEFAULT_MSG LwIP_INCLUDE_DIRS LwIP_SOURCES LwIP_HEADERS)
使用上面的find模块,您的应用程序可以干净地包含该包并使用由find模块创建的变量。
find_package(LwIP REQUIRED)
.
.
(omitted...)
.
.
include_directories(LwIP_INCLUDE_DIRS)
add_executable(${PROJECT_NAME}.elf ${SOURCES})
由于您的工作与STM32和cmake有关,所以让我给您一个很好的参考,这对于您的工作也是一个很好的起点。
https://github.com/ObKo/stm32-cmake.git
希望这会有所帮助。