golang引用c++动态链接库报错 undefined reference to `test
在Go语言中引用C++动态链接库时,出现 "undefined reference to test
" 错误通常是因为Go语言无法直接调用C++的函数,需要使用extern "C"来声明C++函数,从而在Go语言中正确地引用和调用这些函数。
解决方法:
使用 extern "C" 声明
在C++代码中,通过 extern "C" 声明可以将函数的名称修饰符设置为C语言风格,以便Go语言能够正确识别和调用。
cpp// example.h #ifndef EXAMPLE_H #define EXAMPLE_H extern "C" { void test(); // 声明一个C++函数 } #endif
cpp// example.cpp #include "example.h" #include <iostream> void test() { std::cout << "Hello from C++ function" << std::endl; }
编译生成动态链接库
使用C++编译器将代码编译成动态链接库(例如
.so
文件):bashg++ -shared -o libexample.so example.cpp
Go语言调用动态链接库
在Go语言中通过
import "C"
引入C++动态链接库,并使用//export
标记来声明将要导出的C函数:go// main.go package main // #cgo LDFLAGS: -L. -lexample // #include "example.h" import "C" func main() { C.test() }
编译Go程序
在编译Go程序时,需要通过
cgo
工具链和-l
标志链接C++的动态链接库:bashgo build -o main main.go
运行程序
执行编译后的Go程序:
bash./main
注意事项:
- C++函数声明:确保在C++头文件中使用
extern "C"
声明将要在Go中调用的C++函数,以消除名称修饰符带来的问题。 - 链接标志
-l
:在Go的// #cgo LDFLAGS:
中指定动态链接库的链接路径和名称。 - 编译顺序:先编译生成动态链接库,再在Go代码中引用和调用。
- 跨平台问题:Go语言和C++代码通常需要在目标平台上进行编译和链接,确保平台兼容性。
通过以上步骤,可以解决在Go语言中引用C++动态链接库时出现的 "undefined reference to test
" 错误,并成功调用C++函数。