golang引用c++动态链接库报错 undefined reference to `test

在Go语言中引用C++动态链接库时,出现 "undefined reference to test" 错误通常是因为Go语言无法直接调用C++的函数,需要使用extern "C"来声明C++函数,从而在Go语言中正确地引用和调用这些函数。

解决方法:

  1. 使用 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; }
  2. 编译生成动态链接库

    使用C++编译器将代码编译成动态链接库(例如 .so 文件):

    bash
    g++ -shared -o libexample.so example.cpp
  3. 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() }
  4. 编译Go程序

    在编译Go程序时,需要通过 cgo 工具链和 -l 标志链接C++的动态链接库:

    bash
    go build -o main main.go
  5. 运行程序

    执行编译后的Go程序:

    bash
    ./main

注意事项:

  • C++函数声明:确保在C++头文件中使用 extern "C" 声明将要在Go中调用的C++函数,以消除名称修饰符带来的问题。
  • 链接标志 -l:在Go的 // #cgo LDFLAGS: 中指定动态链接库的链接路径和名称。
  • 编译顺序:先编译生成动态链接库,再在Go代码中引用和调用。
  • 跨平台问题:Go语言和C++代码通常需要在目标平台上进行编译和链接,确保平台兼容性。

通过以上步骤,可以解决在Go语言中引用C++动态链接库时出现的 "undefined reference to test" 错误,并成功调用C++函数。