首页 > 解决方案 > 如何包含“<>”级联标题

问题描述

我正在尝试使用 SWIG 来将 C++ 代码用作 Go 模块。我的文件夹是这样组织的:

MyLib/
   -go-integration
      -basic_host
           -basic_host.i
           -basic_host_wrap.cxx // gen by SWIG
           -basic_host_wrap.h // gen by SWIG
           -basic_host.go // gen by SWIG
   -MyLib/
      -include/
          -mylib
             -common.hpp
             -inputs.hpp
             -guests.hpp
             -logger.hpp
             - ...
      -src/
         -guests.cpp
         -logger.cpp
         - ...
          

我的 basic_host.i 文件:

%module(directors="1") basic_host
%{
    #include <atomic>
    #include <map>
    #include <iostream>

    #include "../../MyLib/include/mylib/inputs.hpp"
    #include "../../MyLib/include/mylib/common.hpp"
    #include "../../MyLib/include/mylib/guests.hpp"
%}


%inline %{
 somefunc to export ....
%}

%constant someConstant...

现在我一直在使用的是:

swig -go -cgo -c++ -intgosize 64 .\basic_host.i
go install

In file included from basic_host_wrap.cxx:344:
../../MyLib/include/mylib/common.hpp:6:10: fatal error: mylib/inputs.hpp: No such file or directory
    6 | #include <mylib/inputs.hpp>
      |   
^~~~~~~~~~~~~~~~~~~~~~
compilation terminated.

我的问题是我似乎无法导入我的 C++ 文件,因为它们正在使用“<>”导入文件。但是在 C++ 方面,我使用这些文件没有问题(导入做得很好)。

我的 go 包需要导入,guests.hpp但它会导入common.hpp该导入inputs.hpp并给我该错误。也许有一种方法可以通过 ext 依赖我的 lib 导入直接,而不是给出相对路径,但我还没有找到它。

这种行为可能可以通过 SWIG 使用 gcc/g++ 并且不知道在哪里找到包含文件但我不知道如何更改/尝试这一事实来解释。

标签: c++goswig

解决方案


这就是我所怀疑的,SWIG 使用 gcc 和 cgo 来生成文件,您可以添加作为CGO_CPPFLAGS包含文件路径的环境变量。

$env:CGO_CPPFLAGS="-I D:/Repos/MyLib/MyLib/include"

我也尝试使用 SWIG 的命令 -I 如下:

swig -go -cgo -c++ -I"D:/Repos/MyLib/MyLib/include" -intgosize 64 .\basic_host.i

但它没有直接工作。


推荐阅读