簡體   English   中英

Eclipse CDT鏈接選項-static-libgcc -static-libstdc ++不影響Windows上的行為

[英]Eclipse CDT Link Options -static-libgcc -static-libstdc++ Not Affecting Behavior on Windows

我是Java程序員,但我正在為自己要做的項目(JNI)自學一些C ++。 為此,我使用Eclipse和MinGW GCC用C ++用非常簡單的DLL測試程序編寫了一個非常簡單的DLL。 嘗試在Windows 7(以及我擁有的任何其他版本)上運行測試程序時,出現錯誤libgcc_s_dw2-1.dll丟失。 在閱讀了SO上的其他問題之后,我發現了有關-static-libgcc和-static-libstdc ++鏈接器選項的信息,這些選項已添加到項目設置中。 在我添加靜態選項之前,DLL和exe的文件大小很小,而在添加了靜態選項之后,DLL和exe的文件大小要大得多,這使我相信DLL的實際存在。 但是,嘗試運行該程序時,我仍然遇到丟失的DLL錯誤。 如果我將DLL復制到exe所在的文件夾,則它將運行。 我讀了一些建議,說應該只單獨分發DLL,但這遠非理想,我想盡可能避免它。

我也嘗試僅使用-static鏈接器選項,但由於某些原因,當我這樣做時,編譯器無法找到我的簡單DLL。 如果我刪除-static,它可以再次找到它。 我不確定這是怎么回事,但也許與整個問題有關?

我已經閱讀了有關該主題的所有資料,似乎我在做正確的事,並且DLL正在靜態鏈接到exe,但在運行時沒有效果。 我機智。 任何建議將不勝感激。

謝謝,巴勃羅

更新1我想我還不太清楚。 問題是,即使我將它們靜態鏈接,Windows都說缺少C庫。 當我運行構建時,這些是正在運行的compile和linker命令:

g++ "-IC:\\_projects_eclipse\\bcsdll\\src\\" "-includeC:\\_projects_eclipse\\bcsdll\\src\\bcsdll.h" -O0 -g3 -Wall -c -fmessage-length=0 -o Main.o "..\\Main.cpp" 
g++ "-LC:\\_projects_eclipse\\bcsdll\\Debug" -Wl,-enable-stdcall-fixup -static-libgcc -static-libstdc++ -o bcsdll_tester.exe Main.o -lbcsdll 

問題是,即使我在運行EXE時靜態地同時包含兩個C庫,我仍然會遇到C庫缺少DLL錯誤的情況。 當我使用Dependency Walker檢查EXE和DLL時,它清楚地表明對這兩個C庫沒有依賴關系。 但是,當我運行EXE窗口時,卻說缺少C ++庫。 如果我將庫的副本與DLL和EXE放在同一文件夾中,則程序運行正常。

實際缺少的DLL是libgcc_s_dw2-1.dll。 如果我將該DLL的副本放在EXE文件夾中,則缺少的DLL是libstdc ++-6.dll。

好的,我終於解決了這個問題。 我改用-static而不使用特定的-static-libgcc和-static-libstdc ++選項。 當我這樣做時,我的EXE編譯開始給我錯誤,即使它仍然在同一地方,它也找不到我的hellodll。 進行了更多谷歌搜索,我發現我需要編譯該庫以.a或.so(而不是.dll)結尾。 在Eclipse CDT中四處尋找,我在C / C ++ Build / Settings / Build Artifact選項卡下發現Artifact Type設置為“ Shared Library”。 我將其切換到靜態庫,編譯了DLL,重新編譯了EXE,然后一切正常。

對於使用eclipse for c / c ++但運行* .exe文件並顯示錯誤的Windows用戶很有用:“缺少libstdc ++ 6.dll”

4種解決方法

  1. Eclipse->“項目”->“屬性”->“ C / C ++構建”->“設置”->“工具設置”->“ MinGW C ++鏈接器”->“其他”->“鏈接器標志”(添加“靜態”)

  2. 將“ {{您的MinGW的安裝路徑}} / bin添加到當前的用戶環境變量-Windows中的“路徑”,然后重新啟動Eclipse,最后重新編譯。

  3. 將“ {{安裝MinGW的路徑}} / bin添加到Windows環境變量-“路徑”,然后重新啟動Eclipse,最后重新編譯。

  4. 將文件“ libstdc ++-6.dll”復制到運行* .exe文件的路徑,然后重新運行。 (這不是一個好方法)

注意:文件“ libstdc ++-6.dll”位於文件夾“ {{您的MinGW的安裝路徑}}} / bin中

暫無
暫無

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

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