2016-07-22 55 views
0

工作有這個庫被用作其他項目的參考:https://github.com/RetroAchievements/RASuite/tree/master/RA_IntegrationC++庫的編譯,但不會像以前的版本

我已經下載了編譯的程序(即附帶編譯庫),他們做工精細。我的目標是對庫代碼進行更改,重新編譯它,並用我自己編譯的DLL替換已下載的已編譯程序的DLL。像這樣:

ProgramA.exe 
|_ RA_Integration.dll < replace with my own (built) 

甚至在更改代碼之前,我只是試圖編譯DLL,並沿着我下載的已編譯程序使用它。我不願意重新編譯程序本身,因爲它會因爲依賴關係等而過多工作。而且我也希望能夠將DLL「運送」給任何想要修復的人。

因此,我已經下載了該庫的源代碼,自己成功重新編譯它,但是當我使用它而不是程序自帶的代碼時,它們不會啓動(Windows事件查看器說有一個加載我的DLL時出現問題)。

我假設我的系統與構建原始DLL的系統有差異,並且這是它失敗的原因。我的問題是:我能找到這些差異嗎?雖然我是一名專業的.NET程序員(因爲它是我的工作),但我是一名C++新手,並且我無法理解所有那些似乎將不同的構建/結果從一臺機器轉移到另一臺機器的鏈接器/預編譯器/依賴項/ C++的東西。

所有我已經能夠找到的是在項目屬性中的「平臺工具集」是「Visual Studio 2013 - Windows XP(v120_xp)」,因此我已經安裝了Visual Studio 2013(更新5,因爲它似乎Windows基礎VS2013中沒有XP支持),但這似乎還不夠。我運行的是Windows 10,它確實不是幾年前編譯DLL時使用的原始程序員的操作系統,但不確定是否重要?

是否有任何可以從DLL本身或從項目中發現,可以暗示我在我的系統上需要什麼?

希望是有道理的。

感謝

回答

1

即使改變代碼之前,我只是想編譯DLL,並用它沿着我已經下載了編譯的程序。我不願意重新編譯程序本身,因爲它會因爲依賴關係等而過多工作。而且我也希望能夠將DLL「運送」給任何想要修復的人。

這是你的謬誤:你的DLL是一個鏈接依賴。您必須必須重新生成您的應用程序,因爲顯然,庫的ABI更改,使其與您的程序嘗試調用的功能不兼容,它的預計在DLL中。

使用您寶貴的編程知識構建ABI兼容封裝器DLL是沒有辦法的:)找到這些差異很難 - 因爲,例如,您可以從您的DLL中導出符號列表,它基本上包含所有DLL「提供」的函數,但是這些函數如何被調用的一些方面實際上並不是其中的一部分,只能由鏈接器(或者技術人員在他們手上花費太多時間和不健康的困擾用於解析頭腦中的東西)來自C++源代碼。

換句話說:你改變了你的運行時連接你的程序。你現在必須重建你的程序。期權結束!

+0

謝謝,但我不明白;我沒有對代碼做任何改變,所以ABI是如何改變的?也許我對ABI是什麼有一個錯誤的定義;但我認爲它只會改變,如果你改變了數據結構或函數定義等。只要沒有這樣的代碼改變(在我的情況下根本沒有代碼改變)不應該保持不變嗎? – Nicolas

+0

@Nicolas編譯器的變化,預處理器的變化定義...你需要100%確定你的構建等同於原始的DLL構建(其中,特別是在windows上,是地獄)。 –

+0

有什麼/我可以使用任何工具來確保這些要求?項目中的任何東西?任何方式來「改造工程師」的DLL,並找出我需要在我的最終? – Nicolas