Cgo生成的源无法在MVC上编译

时间:2018-11-30 20:20:55

标签: c++ visual-studio go cgo

我有一个使用CGo制作的共享库,它在Linux和Android上可以很好地链接。但是在使用Microsoft Visual Studio 2017在Windows 10上编译时,出现以下错误:

Microsoft (R) Program Maintenance Utility Version 14.16.27024.1
Copyright (C) Microsoft Corporation.  All rights reserved.

        cl -c -nologo -Zc:wchar_t -FS -Zc:rvalueCast -Zc:inline -Zc:strictStrings -Zc:throwingNew -Zc:referenceBinding -Zc:__cplusplus -O2 -MD -W3 -w34100 -w34189 -w44996 -w44456 -w44457 -w44458 -wd4577 -wd4467 -EHsc -DUNICODE -D_UNICODE -DWIN32 -D_ENABLE_EXTENDED_ALIGNED_STORAGE -DWIN64 -DQT_DEPRECATED_WARNINGS -DQT_NO_DEBUG -DQT_QUICKCONTROLS2_LIB -DQT_QUICK_LIB -DQT_GUI_LIB -DQT_QML_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -DNDEBUG -I. -Irelease -I..\..\Qt\5.12.0\msvc2017_64\include -I..\..\Qt\5.12.0\msvc2017_64\include\QtQuickControls2 -I..\..\Qt\5.12.0\msvc2017_64\include\QtQuick -I..\..\Qt\5.12.0\msvc2017_64\include\QtGui -I..\..\Qt\5.12.0\msvc2017_64\include\QtANGLE -I..\..\Qt\5.12.0\msvc2017_64\include\QtQml -I..\..\Qt\5.12.0\msvc2017_64\include\QtNetwork -I..\..\Qt\5.12.0\msvc2017_64\include\QtCore -Irelease -I\include -I..\..\Qt\5.12.0\msvc2017_64\mkspecs\win32-msvc -Forelease\ @C:\Users\Nick\AppData\Local\Temp\nm2B40.tmp
connekt.cpp
c2.cpp
cgo-gcc-export-header-prolog(15): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
cgo-gcc-export-header-prolog(15): error C2146: syntax error: missing ';' before identifier 'GoUintptr'
cgo-gcc-export-header-prolog(18): error C2146: syntax error: missing ';' before identifier 'GoComplex64'
cgo-gcc-export-header-prolog(18): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
cgo-gcc-export-header-prolog(19): error C2371: '_Complex': redefinition; different basic types
cgo-gcc-export-header-prolog(18): note: see declaration of '_Complex'
cgo-gcc-export-header-prolog(19): error C2146: syntax error: missing ';' before identifier 'GoComplex128'
cgo-gcc-export-header-prolog(19): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
Generating Code...
NMAKE : fatal error U1077: '"C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\bin\HostX86\x64\cl.EXE"' : return code '0x2'
Stop.
NMAKE : fatal error U1077: '"C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\bin\HostX86\x86\nmake.exe"' : return code '0x2'
Stop.

库的标头(.h)由Cgo生成,并且包含以下几行:

typedef signed char GoInt8;
typedef unsigned char GoUint8;
typedef short GoInt16;
typedef unsigned short GoUint16;
typedef int GoInt32;
typedef unsigned int GoUint32;
typedef long long GoInt64;
typedef unsigned long long GoUint64;
typedef GoInt64 GoInt;
typedef GoUint64 GoUint;
//typedef __SIZE_TYPE__ GoUintptr;
typedef size_t GoUintptr;
typedef float GoFloat32;
typedef double GoFloat64;
typedef float _Complex GoComplex64;
typedef double _Complex GoComplex128;

例如,在此行报告了一个错误:

typedef float _Complex GoComplex64;

但是float _Complex是已经定义的类型,为什么不能将其别名为GoComplex64

要修复GoUintptr,我评论了 SIZE_TYPE 行,并用size_t代替了它,但它也没有编译:

//typedef __SIZE_TYPE__ GoUintptr;
typedef size_t GoUintptr;

该如何解决这些编译错误?也许有一些标志使Visual C ++不太严格? (因为在其他平台上我没有任何问题)

1 个答案:

答案 0 :(得分:0)

有同样的问题-我最终注释掉_Complex类型(GoComplex ..)和__SIZE_TYPE__(GoUintPtr)-这样,.h编译

typedef signed char GoInt8;
typedef unsigned char GoUint8;
typedef short GoInt16;
typedef unsigned short GoUint16;
typedef int GoInt32;
typedef unsigned int GoUint32;
typedef long long GoInt64;
typedef unsigned long long GoUint64;
typedef GoInt64 GoInt;
typedef GoUint64 GoUint;
//typedef __SIZE_TYPE__ GoUintptr;
typedef float GoFloat32;
typedef double GoFloat64;
//typedef float _Complex GoComplex64;
//typedef double _Complex GoComplex128;

但是,我仍然没有使用cl链接它:

> cl /EHsc /I ..\libBleveIndexTest main.cpp ..\libBleveIndexTest\libBleveIndexTest.a
Microsoft (R) C/C++ Optimizing Compiler Version 19.16.27024.1 for x64
Copyright (C) Microsoft Corporation.  All rights reserved.

cl : Command line warning D9024 : unrecognized source file type '..\libBleveIndexTest\libBleveIndexTest.a', object file assumed
main.cpp
Microsoft (R) Incremental Linker Version 14.16.27024.1
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:main.exe
main.obj
..\libBleveIndexTest\libBleveIndexTest.a
libBleveIndexTest.a(go.o) : warning LNK4078: multiple '.text' sections found with different attributes (60600060)
libBleveIndexTest.a(000005.o) : warning LNK4217: locally defined symbol _errno imported in function x_cgo_sys_thread_create
libBleveIndexTest.a(000007.o) : warning LNK4049: locally defined symbol _errno imported
libBleveIndexTest.a(000005.o) : error LNK2019: unresolved external symbol __imp___iob_func referenced in function _cgo_preinit_init
libBleveIndexTest.a(000006.o) : error LNK2001: unresolved external symbol __imp___iob_func
libBleveIndexTest.a(000007.o) : error LNK2001: unresolved external symbol __imp___iob_func
libBleveIndexTest.a(000005.o) : error LNK2019: unresolved external symbol __imp__beginthread referenced in function x_cgo_sys_thread_create
libBleveIndexTest.a(000007.o) : error LNK2001: unresolved external symbol __imp__beginthread
main.exe : fatal error LNK1120: 2 unresolved externals

__ imp__iob ...我可以通过添加以下内容来解决:

extern "C" { FILE __iob_func[3] = { *stdin,*stdout,*stderr }; }

到主要的C源代码。 但是,我无法修复“ __imp__beginthread”。