Используйте C ++ в Go: error: 'reinterpret_cast' undeclared - PullRequest
0 голосов
/ 21 декабря 2018

Я пытаюсь вызвать C ++ в Go.

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()));

1 Ответ

0 голосов
/ 21 декабря 2018

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/ dir):

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 ++.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...