在 Go 中使用C++:错误:"reinterpret_cast"未声明

Use C++ in Go: error: 'reinterpret_cast' undeclared

本文关键字:reinterpret cast 未声明 Go 错误 C++      更新时间:2023-10-16

我正在尝试在 Go 中调用C++。

sparkle_windows.h:

#ifndef GO_WINSPARKLE_H
#define GO_WINSPARKLE_H
#ifdef __cplusplus
#include <QResource>
#include "winsparkle.h"
extern "C" {
#endif
void initWinSparkle()
{
    win_sparkle_set_dsa_pub_pem(reinterpret_cast<const char *>(QResource(":/WinSparkle/dsa_pub.pem").data()));
    win_sparkle_init();
}
#ifdef __cplusplus
}
#endif
#endif

main_windows.go:

package main
/*
#cgo CPPFLAGS: -I ${SRCDIR}/WinSparkle/include
#cgo LDFLAGS: -L${SRCDIR}/WinSparkle/Release -lWinSparkle -lsparkle_windows -lstdc++
#include "sparkle_windows.h"
*/
import "C"
func main() {
    C.initWinSparkle()
}

和错误:

In file included from .main_windows.go:10:0:
./sparkle_windows.h: In function 'initWinSparkle':
./sparkle_windows.h:15:30: error: 'reinterpret_cast' undeclared (first use in this function)
  win_sparkle_set_dsa_pub_pem(reinterpret_cast<const char *>(QResource(":/WinSparkle/dsa_pub.pem").data()));

cgo 不会编译C++,因此您需要将 C++ 函数放在 .cpp 文件中并使用 C++ 编译器对其进行编译。然后你生成一个库,只把函数原型放在你的.h文件上。

.h 文件应该是纯 C,例如,你不能使用 c++ 类型作为函数参数。

这里有一个简单的例子(在linux上使用g++/ar制作静态库):

cpplink_test/cpp/cpplink.cpp:

#include <iostream>
#include "cpplink.h"
extern "C" void helloCpp()
{
    std::cout << "Hello from Cpp !!!!n";
}

cpplink_test/cpp/cpplink.h:

#ifdef __cplusplus
extern "C" {
#endif
void helloCpp();
#ifdef __cplusplus
}
#endif

编译并生成静态库(来自 cpp/目录):

g++ -fPIC -c cpplink.cpp
ar cru libcpplink.a cpplink.o
ranlib libcpplink.a

cpplink_test/main.go:

package main
/*
   #cgo CPPFLAGS: -I${SRCDIR}/cpp
   #cgo LDFLAGS: -L${SRCDIR}/cpp -lcpplink -lstdc++
   #include <cpplink.h>
*/
import "C"
import "fmt"
func main() {
    fmt.Println("Hello GO")
    C.helloCpp()
}

构建和运行:

go build
./cpplink_test

输出:

Hello GO
Hello from Cpp !!!!

如果您在 Windows 上,则C++库的创建可能会略有不同。