1. 程式人生 > 其它 >linux使用mingw交叉編譯exe檔案,windows無法執行

linux使用mingw交叉編譯exe檔案,windows無法執行

技術標籤:C++Linuxc++linuxwindows

環境說明

linux:Ubuntu 20.04.1 LTS (win10子系統)
windows:win10
編譯器:x86_64-w64-mingw32-g++
shell:windows powershell, cmd, linux shell
檔案:linux下檔案地址 /home/descosmos/cpp/test.cpp
通過linux訪問windows桌面: cd /mnt/c/User/kingsoft/Desktop

事件還原

在linux中有如下檔案:

test.cpp

#include<cstdio> 
#include
<vector>
using namespace std; int main(){ vector<int> arr(2); arr1[0] = 2; printf("arr[0]: %d.\n", arr[0]); return 0; }

編譯過程:

 x86_64-w64-mingw32-g++ test.cpp -o cmd.exe
 // 將cmd.exe複製到windows環境中
 cp cmd.exe /mnt/c/User/kingsoft/Desktop

在powershell中執行cmd.exe,結果為:
在這裡插入圖片描述
也就是沒顯示任何結果,在這一步我琢磨了好久是為什麼,因為如果不呼叫 iostream,或者stl,printf就可以工作

,最後直到呼叫了cmd。
在cmd中執行cmd.exe,結果為:

在這裡插入圖片描述

問題描述

就是缺少了libstdc+±6.dlllibgcc_s_seh-1.dll檔案,使得cmd.exe在windows環境中無法載入動態庫,執行出現問題。

問題解決

在x86_64-w64-mingw32-g++的安裝目錄下查詢這兩個檔案:

which x86_64-w64-mingw32-g++

在這裡插入圖片描述
可以看到在/usr/目錄中,直接查詢:

find /usr/ -name libstdc++-6.dll
find /usr/ -name libgcc_s_seh-1.dll

在這裡插入圖片描述
將兩個dll拷貝入cmd.exe執行的目錄下:

cp /usr/lib/gcc/x86_64-w64-mingw32/9.3-win32/libstdc++-6.dll /mnt/c/User/kingsoft/Desktop
/usr/lib/gcc/x86_64-w64-mingw32/9.3-win32/libgcc_s_seh-1.dll /mnt/c/User/kingsoft/Desktop

再在powershell下執行cmd.exe可以看見:
在這裡插入圖片描述
解決。

附言

對於linux和windows交叉編譯的環境而言,版本庫的正確與否是十分重要,對於要使用靜態庫的exe檔案而言問題不大,但對於要使用動態庫dll的exe檔案而言,一定要在執行環境下看看是否存在相應的dll檔案。