提问人:Amy Fetzner 提问时间:11/14/2023 更新时间:11/14/2023 访问量:21
如何在 CMake 项目中包含 ISPC 编译器生成的标头?
How do I include ISPC compiler generated headers in a CMake project?
问:
我正在使用 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.h
C:\\...\MyProject\cmake-build-debug\src\core\ispc\CMakeFiles\IspcLib.dir\\.\
#include simd_code_ispc.h
我知道我可以将这个目录硬编码到我的包含中,但我正在寻找我应该如何做到这一点;以一种不特定于我的机器的方式,它仍然允许我重新安排我的项目结构,并将在构建和安装期间工作。
我在网上看到过一些使用自定义命令的示例(包括此堆栈交换帖子) 但是 CMake 在 3.19 中添加了 ISPC 集成,所以我更愿意使用它。
答: 暂无答案
评论
IspcLib
simd_code_ispc.h
target_include_directories(IspcLib INTERFACE <path/to/dir/with/file/simd_code_ispc.h>)