1

该项目具有以下结构:

.
|- CMakeList.txt
`- src
   |- lib
   |  |- CMakeList.txt
   |  `- libA
   |     |- CMakeList.txt
   |     |- libA.c
   |     `- libA.h
   `- main
      |- CMakeList.txt
      `- main.c

我想在using中包含该libA.h文件,但是在尝试编译时发生错误。我可以让 cmake 添加适当的包含标志并且我可以编写.main.c#include "libA.h" fatal error: hello.h: No such file or directory#include "libA.h"

我知道我可以手动添加标志-Ipath/to/src/lib/libA -Ipath/to/src/lib/libB ...,但我想自动化这个过程。

4

4 回答 4

0

Include_directories 应该为您解决这个问题: https ://cmake.org/cmake/help/v3.0/command/include_directories.html

于 2020-02-01T13:02:07.213 回答
0

您可以使用内置的PROJECT_SOURCE_DIRCMake 变量来访问项目的根源目录。将此与target_include_directories()用于:#include "libA.h"main.c

在你的src/main/CMakeLists.txt

add_executable(MyMain main.c)
target_include_directories(MyMain PUBLIC ${PROJECT_SOURCE_DIR}/src/lib/libA)
于 2020-02-01T14:11:51.007 回答
0

你想在你的 libA/CMakeLists.txt 中设置你的 target_include_directories。使用 add_library 构建目标后,您要添加以下指令:

add_library(libA libA.c libA.h)
target_include_directories(libA PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})

该指令将指定 libA 和链接到它的任何目标也将 ${CMAKE_CURRENT_SOURCE_DIR} 视为查找包含的路径。这被称为图书馆的公共标头。理想情况下,您希望这些头文件位于它们自己的子目录中,这样您就可以轻松地将它们包含到您的其他项目中,而无需将 libA.c 文件放在包含目录中。例如:

.
|- CMakeList.txt
`- src
   |- lib
   |  |- CMakeList.txt
   |  `- libA
   |     |- CMakeList.txt
   |     |- include
   |     |  `-libA.h
   |     |- src
   |        `- libA.c
   `- main
      |- CMakeList.txt
      `- main.c
于 2020-02-01T19:06:43.603 回答
0

解决了。

如果我创建库

add_library(MyLib src/MyLib.cpp include/MyLib.h)
target_include_directories(MyLib PUBLIC include)

然后我可以写

add_executable(MyExe ${SOURCES} ${HEADERS})
target_link_libraries(MyExe MyLib)

最后一行将在编译时自动添加标志'-I/path/to/MyLib/include' MyExe

于 2021-04-20T14:14:53.813 回答