如何使用简单的CMake项目正确配置包含路径

时间:2019-03-18 02:31:56

标签: c cmake embedded

我有一个CMake项目,用于交叉编译STM32的可执行文件。项目结构包括用于所需各种依赖项的文件夹,这些文件夹中包含源文件和头文件。建立项目的CMakeLists.txt文件就像设置交叉编译一样简单,然后glob将来自每个依赖项和用户代码的源代码放在一起,然后使用{{1}设置所有标头的位置}。最后,include_directories用于组合所有内容并构建二进制文件。

我意识到,这可能不是执行此操作的最佳方法(应该将deps构建为库),但目前确实有效。

该问题来自具有许多子目录(lwIP)层的dep,并且源文件和头文件包含include语句,这些语句引用该dep中子目录的级别。例如,lwIP文件结构如下:

add_executable

lwIP源文件(或头文件!)可能包含“ lwip / err.h”。当然,preproc无法找到此文件,因为相对路径对此文件没有意义。

我应该如何配置该项目,以便可以在不修改源文件或头文件的情况下使用这些包含项?

1 个答案:

答案 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

希望这会有所帮助。