簡體   English   中英

在Linux上與mingw-w64交叉編譯時的聲明沖突

[英]Conflicting declaration when cross compiling with mingw-w64 on Linux

我一直在試圖找出我在Linux for 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頭文件的環境變量集。 具體來說,我前CPLUS_INCLUDE_PATH.bashrc設置了CPLUS_INCLUDE_PATH ,卻忘記了。 除非在某些特殊情況下需要,否則通常不需要設置此變量。 我個人不依靠它。 我注釋了導出,編譯器似乎正在查找它現在需要的所有標頭。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM