一般在编译 ISPC 代码到时候,构建方法如下:
$ ispc add.ispc -o add.o -h add.h
$ g++ main.cpp add.o
但是在一些情况下连接器会报以下错误:
$ g++ main.cpp add.o
Undefined symbols for architecture x86_64:
"_ISPCAlloc", referenced from:
_add_ispc___un_3C_uni_3E_un_3C_uni_3E_un_3C_uni_3E_ in add.o
_add_ispc in add.o
"_ISPCLaunch", referenced from:
_add_ispc___un_3C_uni_3E_un_3C_uni_3E_un_3C_uni_3E_ in add.o
_add_ispc in add.o
"_ISPCSync", referenced from:
_add_ispc___un_3C_uni_3E_un_3C_uni_3E_un_3C_uni_3E_ in add.o
_add_ispc in add.o
ld: symbol(s) not found for architecture x86_64
出现这个问题是因为你使用了 ISPC 中的task
,这就需要使用 ISPC 任务系统(ISPC tasking system)。
但是 ISPC 默认是不包含任务系统,需要编译的时候添加。代码在一个名为tasksys.cpp
的文件中,你可以在https://github.com/ispc/ispc/tree/main/examples/common找到这个文件,建议保存到一个位置方便后续的使用。
接下来假设这个文件在你的项目目录中,如下(当然你也可以放到一个固定位置,这样每个项目都只用访问这个位置即可):
接下来按照以下命令进行构建:
$ ispc add.ispc -o add.o -h add.h
$ g++ --std=c++11 main.cpp add.o tasksys.cpp -o add
如果不使用--std=c++11
也可以正常运行,但是编译的时候会提示:
$ g++ main.cpp add.o tasksys.cpp -o ad
tasksys.cpp:159:18: warning: defaulted function definitions are a C++11 extension [-Wc++11-extensions]
TaskInfo() = default;
^
1 warning generated.
这时候就能看到编译好了,也可以正确运行。
如果你使用的是 CMake 来构建项目,那么记得在CMakeLists.txt
中的target_sources
部分添加tasksys.cpp
。
希望能帮到有需要的人~