2015-03-30 38 views
0

行爲我是一個Java程序員,但我自學了一些C++的一個項目,我需要做的(JNI)。爲此,我使用Eclipse和MinGW GCC在C++中編寫了一個非常簡單的DLL測試程序。當試圖在Windows 7上運行測試程序(以及任何其他版本)時,我得到一個錯誤,libgcc_s_dw2-1.dll丟失。在閱讀了一些其他問題之後,我發現了有關添加到項目設置中的-static-libgcc和-static-libstdC++鏈接器選項。 DLL和EXE的文件大小是非常小的之前,我添加靜態選擇和添加它們後DLL和EXE都大得多,導致我相信,DLL的實際上得到包括在內。但是,當我試圖運行該程序時,我仍然收到丟失的DLL錯誤。如果我將DLL複製到與exe相同的文件夾中,那麼它就會運行。我讀了一些建議,說應該單獨分發DLL,但這並不理想,如果可能,我想盡量避免。Eclipse CDT的鏈接選項-static-libgcc的-static-的libstdC++不影響在Windows

我也嘗試了使用-static連接選項,但由於某種原因,當我這樣做,那麼編譯器找不到我簡單的DLL。如果我刪除 - 靜態它可以再次找到它很好。我不確定這是關於什麼,但也許它與整體問題有關?

我已經閱讀了關於此主題的一切,我似乎在做正確的事情,並且DLL正在靜態鏈接到exe,但它在運行時沒有影響。我在我的智慧結束。任何建議將不勝感激。

感謝, 巴勃羅

更新1 我想我是不是完全清楚的。問題是Windows即使我將它們靜態鏈接,C庫也會丟失。當我運行構建這些編譯器和鏈接命令正在運行:

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 

的問題是,即使我既包括C庫靜態當我運行的EXE我仍然得到一個缺少DLL錯誤的C庫。當我用Dependency Walker檢查EXE和DLL時,它清楚地顯示了對兩個C庫沒有依賴關係。然而,當我運行EXE窗口時,C++庫缺失。如果我將庫的副本與我的DLL和EXE放在同一個文件夾中,那麼程序運行良好。

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

+0

我要補充一點,我還下載的Dependency Walker,並根據該程序存在於C和C++庫不存在依賴關係,當我與鏈接選項編譯,但依賴確實顯示了,當我編譯沒有它。我猜Windows是愚蠢的,但我嘗試了幾個不同的系統,並在所有這些系統上得到相同的錯誤。 – 2015-03-30 23:35:28

+0

你能告訴我們makefile或編譯標誌對話框的內容嗎? – a3f 2015-03-31 03:38:44

+0

我不知道在哪裏可以找到makefile,因爲它似乎主要是由IDE自動執行的。你指的是哪個編譯對話框?看起來有幾個。在C/C++ Build/GCC C++編譯器/所有選項框中,它包含以下內容:-I「C:\\ _ projects_eclipse \ bcsdll \ src \」-include「C:\ _ projects_eclipse \ bcsdll \ src \ bcsdll.h」-O0 -g3 -Wall -c -fmessage-length = 0請注意,實際上有一個\ after -include「C:......它似乎沒有出現在網站上 – 2015-03-31 04:03:54

回答

1

好吧,我終於解決了這一點。我切換到使用-static而沒有特定的-static-libgcc和-static-libstdC++選項。當我這樣做,我的EXE編譯開始給我錯誤,即使它仍然在同一個地方,它找不到我的hellodll。還有一些谷歌搜索,我發現我需要編譯庫結束與.a或.so而不是.dll。在Eclipse CDT中徘徊我在C/C++ Build/Settings/Build Artifact選項卡下發現Artifact Type被設置爲「Shared Library」。我將它切換到靜態庫,編譯DLL,重新編譯EXE,並且一切正常。

相關問題