如何在 CMake 项目中包含 ISPC 编译器生成的标头?

How do I include ISPC compiler generated headers in a CMake project?

提问人:Amy Fetzner 提问时间:11/14/2023 更新时间:11/14/2023 访问量:21

问:

我正在使用 ISPC 编译 .ispc 文件并使用 CMake 将它们链接到我的 C++ 项目。ISPC 的一个怪癖是它生成要包含在 C++ 代码中的头文件。为了便于构建它,我所有的 ISPC 文件都在一个静态库中。我的 C++ 代码的核心位于依赖于 ISPC 库的静态库中。最后,我的项目可执行文件是一个单独的项目,它链接到核心 C++ 代码(这是用于单元测试,但在这里无关紧要)。

这是我的文件结构:

src/
 |
 + core/
 |  |
 |  +--CMakeLists.txt
 |  +--core_code.cpp
 |  |
 |  + ispc/
 |    |
 |    +--CmakeLists.txt
 |    +--simd_code.ispc
 | 
 + runner/
    |
    +--CMakeLists.txt
    +--main.cpp

我的CMakeLists文件的相关部分如下

# src/CMakeList.txt
add_subdirectory(core)
add_subdirectory(runner)
# src/core/CMakeLists.txt
add_library(CoreLib STATIC)
target_sources(CoreLib PUBLIC core_code.cpp)

# Add ISPC dependent code
add_subdirectory(ispc)
target_link_libraries(CoreLib PUBLIC IspcLib)

target_include_directories(CoreLib PUBLIC
        $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
        $<INSTALL_INTERFACE:include>
        )
# I believe I need to specify another include dirs here - where the ISPC headers are generated
# src/core/ispc/CMakeLists.txt
add_library(IspcLib STATIC simd_code.ispc)
# No include dirs or link libs since the ispc code is stand-alone
# src/runner/CMakeLists.txt
add_executable(ProjectExe main.cpp)
target_link_libraries(ProjectExe PRIVATE CoreLib)

令人惊讶的是,我能够构建我的 CoreLib 目标(core_code.cpp包括生成的标头)。查看 make 文件,它在构建核心目标时指定的 include 目录是 ISPC 生成文件的位置。 我无法构建依赖于核心的运行器目标,并出现未找到的错误。simd_code_ispc.hC:\\...\MyProject\cmake-build-debug\src\core\ispc\CMakeFiles\IspcLib.dir\\.\#include simd_code_ispc.h

我知道我可以将这个目录硬编码到我的包含中,但我正在寻找我应该如何做到这一点;以一种不特定于我的机器的方式,它仍然允许我重新安排我的项目结构,并将在构建和安装期间工作。

我在网上看到过一些使用自定义命令的示例(包括此堆栈交换帖子) 但是 CMake 在 3.19 中添加了 ISPC 集成,所以我更愿意使用它。

C++ 、CMake ISPC

评论

0赞 Tsyvarev 11/14/2023
如果库为其用户提供标头,则此标头是其接口。因此,您需要将包含标头的目录声明为 INTERFACE include directory: 。IspcLibsimd_code_ispc.htarget_include_directories(IspcLib INTERFACE <path/to/dir/with/file/simd_code_ispc.h>)

答: 暂无答案