2017-02-13 110 views
-4

當我在C++上編譯SDL項目時,它會爲我創建一個可執行文件。當我運行該可執行文件時,如果我在同一個目錄中沒有SDL.dll,它將不起作用。我明白,因爲它需要找到所有正在使用的庫和API。編譯器編譯也包含了嗎?

但是當我創造我自己的圖書館,包括它的代碼,爲什麼不它需要在同一個目錄?爲什麼它可以被徹底刪除並且可執行文件仍然可以運行?例如,我自己的庫和SDL有什麼區別?

+2

你編譯自己的庫作爲靜態庫? – tkausl

+0

我的意思是我自己的頭文件和cpp文件。 –

回答

1

是什麼編譯器編譯是一個翻譯單元,或編譯單元。這包括每個cpp文件的標題。

然後你有鏈接器。這將您編譯的代碼鏈接成可用的表單。

的.DLL文件很可能是搜索和當包含您的應用程序運行。

當您使用自己的圖書館,你可能包含到您的鏈接步驟程序。 (靜態鏈接)您可以刪除它,因爲它不再需要。

(因爲你給的細節是有點不清楚 - 這可能是也可能不是故事的全部)

0

我不是專家,但我認爲這個信息可能是

編譯依賴於有用使用compilator但是它通常需要4個步驟,這是GCC的一個例子:

  • 預處理
  • 彙編
  • 屁股embly

在第一步驟中的compilator替換包括生成.i文件,該文件具有包括頭但不是那些的執行。

在編譯步驟中,編譯器處理.i文件並輸出.s文件,該文件包含翻譯成裝配方案,沒有實現尚未。

在第三步驟中,.s文件被翻譯成機器代碼,生成.OBJ二進制文件(因爲a.out的已過時通常在ELF格式中,文件擴展名是隻是傳承)

在第四步驟中,所有.obj文件都與其他.obj和靜態庫鏈接,在這裏,所有這些文件的代碼都合併到最終的可執行文件中。

如果有未實現的功能,但根據需要在鏈接步驟一dynlib已申報鏈接和運行後,程序將尋找它的主機,這就是正在發生的事情向你SDL。

有2個可能的修復您的問題。

  • (正確)將SDL2.dll與您的二進制文件一起運輸並在安裝中進行設置。

  • (不知錯)建立SDL靜態OBJ和與二進制建立一個獨立的可執行文件

祝你好運鏈接它;)