CMake add_custom_command失败,bin / sh:1:...未找到

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CMake add_custom_command失败,bin / sh:1:...未找到相关的知识,希望对你有一定的参考价值。

我想要实现的目标

我尝试设置工具链来为英特尔FPGA编译OpenCL应用程序。因此,在构建基于C ++的主机应用程序之下,我需要为OpenCL内核调用Intel OpenCL脱机编译器。

只有在编辑了cl源文件或缺少生成的二进制文件时才会执行此步骤。我的方法是添加一个自定义命令来调用CL编译器并创建一个依赖于此命令生成的输出的自定义目标。离线Open CL编译器称为aoc,由于系统上存在多个SDK-Versions的可能性,我使用存储在aocExecutable中的绝对路径调用它。这是我的CMakeLists.txt的相关部分

set (CLKernelName "vector_add")
set (CLKernelSourceFile "$PROJECT_SOURCE_DIR/$CLKernelName.cl")
set (CLKernelBinary     "$PROJECT_BINARY_DIR/$CLKernelName.aocx")

add_executable (HostApplication main.cpp)

# ------ a lot of unneccessary details here ------ 

add_custom_command (OUTPUT  "$CLKernelBinary"
                    COMMAND "$aocExecutable -march=emulator $CLKernelSourceFile -o $CLKernelBinary"
                    DEPENDS "$CLKernelSourceFile"
)


add_custom_target (CompileCLSources DEPENDS "$CLKernelBinary")
add_dependencies (HostApplication CompileCLSources)

什么不起作用在Linux下的CLion IDE中运行它会导致此错误:

/bin/sh: 1: /home/me/SDKsAndFrameworks/intelFPGA/18.1/hld/bin/aoc -march=emulator /home/me/CLionProjects/cltest/vector_add.cl -o /home/me/CLionProjects/cltest/cmake-build-debug-openclintelfpgasimulation/vector_add.aocx: not found

整个命令正确扩展,复制它并将其粘贴到终端工作没有问题,所以我不知道not found错误意味着什么。

进一步问题

假设上述问题将得到解决,我怎样才能实现,如果输出文件不在构建目录中,而且如果编辑了CL源文件,则不仅会调用自定义命令?

答案

正如您在错误消息中看到的那样,bash解释整个命令行

/home/me/SDKsAndFrameworks/intelFPGA/18.1/hld/bin/aoc -march=emulator /home/me/CLionProjects/cltest/vector_add.cl -o /home/me/CLionProjects/cltest/cmake-build-debug-openclintelfpgasimulation/vector_add.aocx

作为单个可执行文件。

这是因为您在脚本中使用双引号包装COMMAND。

删除这些双引号,所以一切都会工作。


与许多其他脚本语言一样,在CMake中,双引号使得引用的字符串被解释为函数或宏的单个参数。

但是在add_custom_command / add_custom_target函数中,关键字COMMAND启动一个参数列表,其中第一个表示可执行文件,另一个表示该可执行文件的分隔参数。

以上是关于CMake add_custom_command失败,bin / sh:1:...未找到的主要内容,如果未能解决你的问题,请参考以下文章

在 cmake 中,我怎样才能始终执行一个进程? (或从 add_custom_command 捕获标准输出)

80个CMake命令

CMake add_custom_command失败,bin / sh:1:...未找到

cmake install 不会触发自定义命令

当目标位于子目录中时替代 CMake POST_BUILD 命令

在add_custom_command中连接多个文件