解决:cc1.exe: sorry, unimplemented: 64-bit mode not compiled in

本文介绍在Windows环境下使用Go语言通过cgo连接Oracle数据库的方法。为解决此问题,文章详细介绍了如何安装配置MinGW及其版本选择,并针对具体错误提供了解决方案。

在win下用Go语言的cgo时(比如下面场景)我们会用到的GCC编译器,Win下我们一般用MinGW。

Golang连接Oracle数据库win下 golang 跨平台编译

MinGW全称Minimalist GNU For Windows,是个精简的Windows平台C/C++、ADA及Fortran编译器,相比Cygwin而言,体积要小很多,使用较为方便。MinGW提供了一套完整的开源编译工具集,以适合Windows平台应用开发,且不依赖任何第三方C运行时库。

MinGW包括: 
一套集成编译器,包括C、C++、ADA语言和Fortran语言编译器 
用于生成Windows二进制文件的GNU工具的(编译器、链接器和档案管理器) 
用于Windows平台安装和部署MinGW和MSYS的命令行安装器(mingw-get) 
用于命令行安装器的GUI打包器(mingw-get-inst)

MingW 分 32位和64位版本:下载地址分别如下:

http://sourceforge.net/projects/mingw/

http://sourceforge.net/projects/mingw-w64/

比如我在使用 go-oci8 时就碰到过下面错误:

# github.com/wendal/go-oci8 
cc1.exe: sorry, unimplemented: 64-bit mode not compiled in

注意,简单起见我们要下载的是编译好的版本,而不是 mingw-w64-v3.1.0.tar.bz2 (7.0 MB)

我下载的是:

http://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win64/Personal%20Builds/mingw-builds/4.8.2/threads-posix/seh/ 

http://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win64/Personal%20Builds/mingw-builds/4.8.2/threads-win32/seh/

目前主要有三种不同的线程库的定义,分别是Win32,OS/2,以及POSIX,前两种定义只适合于他们各自的平台,而POSIX 定义的线程库是适用于所有的计算平台的。我这里选的是threads-posix。

http://zh.wikipedia.org/wiki/POSIX%E7%BA%BF%E7%A8%8B 

 

C++ Exceptions有DWARF、SJLJ、SEH三种处理方式。对应的我们这里选择的是seh方式。

这里的最新那个版本:

http://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win64/Personal%20Builds/mingw-builds/4.8.2/threads-posix/seh/x86_64-4.8.2-release-posix-seh-rt_v3-rev2.7z/download

 

image

下载完成后,解压缩到响应目录,比如我这里是解压缩到  C:\MinGW\mingw64 目录下, 我还需要在 path 环境变量中增加 C:\MinGW\mingw64\bin 确保可以找到gcc。


http://www.cnblogs.com/ghj1976/p/3540257.html

<think>我们正在处理一个编译错误:"sorry, unimplemented: non-trivial designated initializers not supported"。这个错误通常发生在C++代码中使用了C99风格的指定初始化器(designated initializers),而当前编译器对C++的支持不完全(特别是C++20之前的标准)。根据引用[2]和[3],错误示例包括: - 初始化时打乱成员顺序(如先.b后.a) - 初始化时指定了不存在的成员(如.c) - 使用字符作为数组索引进行初始化(如`int code[128] = {['A']=10};`) 引用[4]提到,C++不支持非平凡的指定初始化器,并给出了一个解决方案:按照结构体成员定义的顺序初始化,且不能省略中间成员(除非有默认值)。引用[5]则展示了另一种方法:先创建一个结构体实例,然后逐个赋值,最后将实例放入容器。 因此,解决方案如下: 1. 如果是在C++中使用结构体初始化,应避免使用指定初始化器(即`.member = value`形式),改为传统的顺序初始化。 例如,引用[4]中的代码改为: ```cpp static const AVClass framesync_class = { LIBAVUTIL_VERSION_INT, // version "framesync", // class_name framesync_name, // item_name AV_CLASS_CATEGORY_FILTER, // category NULL, // option OFFSET(parent) // parent_log_context_offset }; ``` 2. 如果必须使用指定初始化器(C++20支持部分指定初始化器,但有限制),则需确保: - 使用C++20或更高版本(需要编译器支持)。 - 初始化时,指定的成员必须是按声明顺序出现的,且不能跳过任何没有默认值的成员(但可以跳过有默认值的成员)[^2]。 - 不能初始化不存在的成员。 3. 对于数组初始化,如引用[3]中的例子,在C++中不能使用`['A']=10`这样的方式。可以改为: ```cpp int code[128] = {}; code['A'] = 10; code['B'] = 11; // ... 依次赋值 ``` 或者使用循环结合查找表(如果初始化有规律)。 4. 如果初始化复杂,可以像引用[5]那样,先定义结构体变量,再逐个赋值,然后使用。 5. 对于C++20以下的标准,没有指定初始化器的支持,所以必须用顺序初始化或逐个赋值。 综上所述,根据你的代码情况选择合适的方法。 注意:在C++20中,指定初始化器被引入,但要求严格(按顺序且不能跳过没有默认值的成员)。因此,如果编译器支持C++20,可以尝试升级编译选项,并确保初始化写法符合C++20标准。 例如,在C++20中,以下写法是允许的(但要注意顺序): ```cpp struct FOO { int a; int b; }; FOO foo = {.a=1, .b=2}; // 正确 FOO foo1 = {.a=1}; // 正确,b被初始化为0(如果b是内置类型且没有默认值,则零初始化) // FOO foo2 = {.b=2, .a=1}; // 错误,顺序不对 ``` 所以,请检查你的编译器是否支持C++20(编译选项如`-std=c++20`),并调整初始化写法。 如果无法使用C++20,则必须避免使用指定初始化器。 根据引用[1]和[3],错误发生在将.c文件改为.cpp文件后,因为C语言支持指定初始化器,而C++(在C++20之前)不支持。 因此,解决方法总结: - 降级:将文件改回.c后缀(如果可行,但这样就不能用C++特性了)。 - 修改代码:按照上述建议修改初始化方式。 - 升级编译器标准:如果使用C++20,确保编译器支持并设置正确选项,然后按C++20规则使用指定初始化器。 请根据实际情况选择。 §§相关问题§§ 1. 如何在C++中正确使用指定初始化器? 2. 如何设置编译器以支持C++20的指定初始化器? 3. 除了指定初始化器,C++中还有哪些初始化结构体的方法? 4. 为什么C++20之前不支持指定初始化器? </think> ### 解决 "non-trivial designated initializers not supported" 错误的方法 这个错误通常发生在 **C++ 代码中使用 C99 风格的指定初始化器**时。根本原因是 C++ 在 C++20 标准前不支持非平凡的指定初始化器(如乱序初始化、跳过成员等)。以下是具体解决方案: #### 1. **改用传统顺序初始化(推荐)** - 严格按照结构体/数组定义的成员顺序初始化,**禁止打乱顺序或跳过成员** - 错误示例(引用[2][^2]): ```cpp FOO foo2 = {.b = 2, .a = 1}; // 错误:乱序 ``` - 正确修改: ```cpp FOO foo = {1, 2}; // 按声明顺序初始化 a, b ``` #### 2. **避免初始化不存在的成员** - 确保初始化器中的字段名与定义完全匹配 - 错误示例(引用[2][^2]): ```cpp FOO foo3 = {.a = 1, .c = 2}; // 错误:c 不是成员 ``` - 正确修改: ```cpp FOO foo = {1, 2}; // 仅初始化实际成员 ``` #### 3. **数组初始化改用显式赋值** - 字符索引初始化在 C++ 中不合法(引用[3][^3]) - 错误示例: ```cpp int code[128] = {['A'] = 10}; // C99 风格,C++ 不支持 ``` - 正确修改: ```cpp int code[128] = {}; code['A'] = 10; // 后续显式赋值 ``` #### 4. **复杂结构体:分步初始化** - 先声明实例,再逐个赋值(引用[5][^5]) ```cpp typedef struct { int month, day, year; } Date; int main() { std::vector<Date> dates; Date d; d.day = 1; // 分步赋值 d.year = 2; dates.push_back(d); } ``` #### 5. **升级到 C++20 并规范使用** - 在 `CMakeLists.txt` 或编译命令中添加 `-std=c++20` - C++20 支持**顺序一致的指定初始化**(仍不允许乱序或跳过): ```cpp // C++20 合法(顺序正确且字段存在) FOO foo = {.a = 1, .b = 2}; ``` #### 错误根源总结 | 错误类型 | C99 支持 | C++ (C++20 前) | C++20 支持 | |------------------|----------|----------------|------------------| | 顺序初始化 | ✓ | ✓ | ✓ | | 乱序指定初始化 | ✓ | ✗ | ✗ | | 跳过成员初始化 | ✓ | ✗ | ✗ | | 不存在成员初始化 | ✗ | ✗ | ✗ | > 💡 **关键提示**:当 `.c` 文件改为 `.cpp` 后触发此错误,本质是 C 与 C++ 的语法差异导致[^1]。建议优先采用顺序初始化或分步赋值方案。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值