如何解决使用 ISPC 构建编译项目代码的时候出现_ISPCAlloc、_ISPCLaunch、_ISPCSync的连接器错误

一般在编译 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 构建编译项目代码的时候出现_ISPCAlloc、_ISPCLaunch、_ISPCSync的连接器错误_第1张图片

接下来按照以下命令进行构建:

$ 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

希望能帮到有需要的人~

你可能感兴趣的:(C,语言家族的笔记,C/C++,ispc)