Cgo找不到<iostream>之类的标准库

时间:2019-07-12 09:59:35

标签: c++ go cgo

我正在尝试在Go代码中包含C ++代码,但是无法识别。

我首先想到它将其视为C代码并尝试(并失败)这样的编译方式,但是实际上删除包含行给了我这样的c ++错误疑难解答 error: ‘cout’ is not a member of ‘std’ 该代码可以使用g ++正确编译。

我尝试添加-lstdc ++ LDLFLAG,并在CXXFLAG中添加到lib的路径,但这并没有改变。

我做了其他一些测试(都失败了),但这是最小的测试。

这是c ++文件

test.cpp

#include "test.hpp"
    int test() 
    {
        std::cout << "Hello, World! ";
        return 0;
    }

test.hpp 
#include <iostream>
int test() ;

这是我的go文件

//#cgo CXXFLAGS: -I/usr/lib/
//#cgo LDFLAGS: -L/usr/lib/ -lstdc++
//#include "test.hpp"
import "C"

func main() {
    C.test()
}

我使用go build进行编译,但是我也尝试使用env CGO_ENABLED CGO_CXXFLAGS="-std=c++11" go build(env部分是特定于鱼的),并且它返回相同的错误。

应该可以正确编译,但是我有iostream: No such file or directory

编辑: 我尝试按照注释中的建议添加CFLAGS: -x c++,编译器在正确的位置进行搜索,但是出现另一个错误invalid conversion from ‘void*’ to ‘_cgo_96e70225d9dd_Cfunc_test(void*)::<unnamed struct>*’ [-fpermissive],我不知道它是否与此新的flafg相关

1 个答案:

答案 0 :(得分:0)

cgo使用Go包装C很容易,但是C ++有点不同。您必须extern "C"要使用make a function-name in C++ have 'C' linkage的功能,否则链接器将看不到该功能。因此,实际的问题出在C ++头文件中。如果因为它是一个库而无法更改C ++代码,则可能必须编写包装器(example)。

这将编译:

.
├── test.cpp
├── test.go
└── test.hpp

test.hpp

#ifdef __cplusplus
extern "C" {
#endif

    int test();
#ifdef __cplusplus
}
#endif

test.cpp

#include <iostream>
#include "test.hpp"
int test() {
    std::cout << "Hello, World! ";
    return 0;
}

test.go

package main

// #cgo CXXFLAGS: -I/usr/lib/
// #cgo LDFLAGS: -L/usr/lib/ -lstdc++
// #include "test.hpp"
import "C"

func main() {
    C.test()
}

将文件放在同一文件夹中, 运行go build

  

你好,世界!