【问题标题】:Cgo can't find standard libraries like <iostream>Cgo 找不到像 <iostream> 这样的标准库
【发布时间】:2019-07-12 09:59:35
【问题描述】:

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

我首先认为它认为它是 C 代码并尝试(并失败)编译,但删除包含行实际上给了我这样的 C++ 错误故障排除 error: ‘cout’ is not a member of ‘std’ 代码用 g++ 正确编译。

我尝试添加 -lstdc++ LDLFLAG,并在 CXXFLAG 中添加库的路径,但它并没有改变任何事情。

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

这是 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(环境部分是特定于鱼的),它返回相同的错误。

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

编辑: 我尝试按照 cmets 中的建议添加 CFLAGS: -x c++,编译器在正确的位置进行搜索,但我收到另一个错误 invalid conversion from ‘void*’ to ‘_cgo_96e70225d9dd_Cfunc_test(void*)::&lt;unnamed struct&gt;*’ [-fpermissive],我不知道它是否与这个新标志有关

【问题讨论】:

  • 我没有看到证据表明它“试图将其编译为 C 代码”,只是它找不到标准库头文件之一。
  • 这不是我尝试编译的唯一代码,而且它不理解 c++ 语法,我将编辑我的问题
  • 你还应该展示你是如何触发这个过程的,即你使用了什么命令。
  • 其实你是对的,和C代码没有关系,我更正了问题,非常感谢
  • 使用#cgo CFLAGS: -x c++#cgo LDFLAGS: -lstdc++

标签: c++ go cgo


【解决方案1】:

cgo 使得用 Go 封装 C 语言变得非常容易,但是 C++ 有点不同。你必须extern "C"你想要make a function-name in C++ have 'C' linkage的函数,否则链接器将看不到该函数。因此,实际问题出在 C++ 头文件中。如果由于 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

你好,世界!

【讨论】:

  • 感谢您的回答,终于成功了。但是,为什么要将 #include &lt;iostream&gt; 放在 .cpp 而不是 .hpp 中?
  • 我相信在 C++ 中,大多数人都将所需的包含放在标题中,以及仅在 cpp 文件中需要的任何内容
  • 我现在看到了,但是当我把它放回 hpp 时,为什么它给了我和以前一样的错误 (iostream: No such file or directory)? (即使我把它放在 extern "C" 里面)
  • tbh 我不确定。可能是因为我们将它导入到 test.go 文件中,并且只需要类似 C 的代码
  • 所以说我在 hpp 中有 c++ 特定的代码,我不能让它工作,对吧?因为那是我从一开始就遇到的问题
猜你喜欢
  • 2022-09-28
  • 2016-12-12
  • 2015-01-05
  • 2018-01-21
  • 2014-05-21
  • 1970-01-01
  • 1970-01-01
  • 2017-05-30
  • 1970-01-01
相关资源
最近更新 更多