在 Go 中使用C++:错误:"reinterpret_cast"未声明
Use C++ in Go: error: 'reinterpret_cast' undeclared
我正在尝试在 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++库的创建可能会略有不同。
相关文章:
- 如何理解C++标准N3337中的expr.const.cast子句8
- C++Cast运算符过载
- 错误:"cast"未命名类型void setCastDescription(std::string
- 通过使用 const-cast 的非常量引用来延长临时的寿命
- "(void) cast"与功能有什么区别 "__attributes__"来沉默未使用的参数警告?
- C++:"Expected '(' for function-style cast or type construction"错误
- 为什么选择 g++ 给予者:"error: cast to pointer from integer of different size [-Werror=int-to-pointer-cast]"
- Gtk+ g_signal_connect() 和 C++ lambda 会导致"invalid cast"错误
- Shared_ptr cast vs static_cast speed
- C++20 中的严格别名规则是否允许标准 c++ unicode 字符和下划线类型之间"reinterpret
- 在 iOS 上使用 Aruco 构建 OpenCV 时"Functional-style cast from id to double is not allowed"
- 覆盖 CAST 运算符(我认为它被称为向下转换)
- C++错误,隐 <function-style-cast> 式要求使用模板化类一次调用多个构造函数的多个转换
- 如何修复<function-style-cast>错误:无法从'initializer list'转换为asdending比较<W>(模板函子)
- C++ C++ 中的函数声明,键入 CAST
- static_cast会丢弃错误,但C风格的演员cast有效
- C++ cast char * to unsigned char
- 禁用 Clang 中的"cast from pointer to smaller type uint32_t"错误
- 是否可以使用gcc 3.3版修复与int*cast相关的Sun Solaris OS 5.8分段故障
- C++ const-cast 一个引用