在Linux上与mingw-w64交叉编译时声明冲突



我一直在试图找出一个问题,我一直在Linux上为Windows交叉编译c++代码。我要编译的代码是:

#include <iostream>
int main(int argc, char** argv){
    std::cout<<"Hello World!n";
    return 0;
}

我正在尝试编译64位windows安装,所以我运行:

x86_64-w64-mingw32-g++ main.cpp

,但会产生以下错误:

In file included from /usr/include/sched.h:34:0,
                 from /usr/include/pthread.h:23,
                 from /usr/x86_64-w64-mingw32/include/c++/4.9.2/x86_64-w64-mingw32/bits/gthr-default.h:35,
                 from /usr/x86_64-w64-mingw32/include/c++/4.9.2/x86_64-w64-mingw32/bits/gthr.h:148,
                 from /usr/x86_64-w64-mingw32/include/c++/4.9.2/ext/atomicity.h:35,
                 from /usr/x86_64-w64-mingw32/include/c++/4.9.2/bits/ios_base.h:39,
                 from /usr/x86_64-w64-mingw32/include/c++/4.9.2/ios:42,
                 from /usr/x86_64-w64-mingw32/include/c++/4.9.2/ostream:38,
                 from /usr/x86_64-w64-mingw32/include/c++/4.9.2/iostream:39,
                 from main.cpp:1:
/usr/include/time.h:75:18: error: conflicting declaration ‘typedef __time_t time_t’
 typedef __time_t time_t;
                  ^
In file included from /usr/x86_64-w64-mingw32/include/stddef.h:7:0,
                 from /usr/lib/gcc/x86_64-w64-mingw32/4.9.2/include/stddef.h:1,
                 from /usr/include/wchar.h:51,
                 from /usr/x86_64-w64-mingw32/include/c++/4.9.2/cwchar:44,
                 from /usr/x86_64-w64-mingw32/include/c++/4.9.2/bits/postypes.h:40,
                 from /usr/x86_64-w64-mingw32/include/c++/4.9.2/iosfwd:40,
                 from /usr/x86_64-w64-mingw32/include/c++/4.9.2/ios:38,
                 from /usr/x86_64-w64-mingw32/include/c++/4.9.2/ostream:38,
                 from /usr/x86_64-w64-mingw32/include/c++/4.9.2/iostream:39,
                 from main.cpp:1:
/usr/x86_64-w64-mingw32/include/crtdefs.h:138:20: note: previous declaration as ‘typedef __time64_t time_t’
 typedef __time64_t time_t;
                    ^
In file included from /usr/x86_64-w64-mingw32/include/c++/4.9.2/cwctype:50:0,
                 from /usr/x86_64-w64-mingw32/include/c++/4.9.2/bits/locale_facets.h:39,
                 from /usr/x86_64-w64-mingw32/include/c++/4.9.2/bits/basic_ios.h:37,
                 from /usr/x86_64-w64-mingw32/include/c++/4.9.2/ios:44,
                 from /usr/x86_64-w64-mingw32/include/c++/4.9.2/ostream:38,
                 from /usr/x86_64-w64-mingw32/include/c++/4.9.2/iostream:39,
                 from main.cpp:1:
/usr/include/wctype.h:52:27: error: conflicting declaration ‘typedef long unsigned int wctype_t’
 typedef unsigned long int wctype_t;
                           ^
In file included from /usr/x86_64-w64-mingw32/include/stddef.h:7:0,
                 from /usr/lib/gcc/x86_64-w64-mingw32/4.9.2/include/stddef.h:1,
                 from /usr/include/wchar.h:51,
                 from /usr/x86_64-w64-mingw32/include/c++/4.9.2/cwchar:44,
                 from /usr/x86_64-w64-mingw32/include/c++/4.9.2/bits/postypes.h:40,
                 from /usr/x86_64-w64-mingw32/include/c++/4.9.2/iosfwd:40,
                 from /usr/x86_64-w64-mingw32/include/c++/4.9.2/ios:38,
                 from /usr/x86_64-w64-mingw32/include/c++/4.9.2/ostream:38,
                 from /usr/x86_64-w64-mingw32/include/c++/4.9.2/iostream:39,
                 from main.cpp:1:
/usr/x86_64-w64-mingw32/include/crtdefs.h:107:24: note: previous declaration as ‘typedef short unsigned int wctype_t’
 typedef unsigned short wctype_t;
                        ^

错误行:

/usr/include/time.h:75:18: error: conflicting declaration ‘typedef __time_t time_t’
 typedef __time_t time_t;

告诉我,mingw-w64使用的是linux库,而不是为windows编译的库,但在搜索后,我似乎不知道如何解决这个问题。我使用的是官方存储库中的Archlinux和mingw-w64包组。我尝试重新安装mingw-w64包组,认为可能库没有正确编译,但我仍然收到相同的错误。

为了清楚起见,我可以用以下方式编译此代码:
g++ main.cpp
任何帮助或任何东西给我指出正确的方向,我将非常感激。谢谢你。

您似乎允许您的mingw-w64编译器搜索本机linux-gnu编译器的头文件树。这是完全错误的。这些头文件在编译本机代码时仅用于;你必须绝不允许允许交叉编译器看到它们。每个单独的编译器,无论是本地的还是交叉的,都有自己特定的系统头文件集;每个人应该只被允许看到属于自己的东西。

你似乎也对库和头文件各自的角色感到困惑。库只在链接时起作用;他们在编译过程中没有任何作用。头文件描述了库提供的特性;编译器使用的就是这些描述。它是使用库的链接器;链接器是一个单独的程序,通常在编译过程本身完成后由编译器驱动程序调用。

问题是mingw-w64使用一个环境变量集来查找linux头文件。具体来说,我之前在我的.bashrc中设置了CPLUS_INCLUDE_PATH,并且忘记了它。这个变量通常不需要设置,除非有一些特殊情况需要它。我个人并不依赖它。我注释掉了导出,编译器似乎找到了它现在需要的所有头文件。

最新更新