當我在C++上編譯SDL項目時,它會爲我創建一個可執行文件。當我運行該可執行文件時,如果我在同一個目錄中沒有SDL.dll,它將不起作用。我明白,因爲它需要找到所有正在使用的庫和API。編譯器編譯也包含了嗎?
但是當我創造我自己的圖書館,包括它的代碼,爲什麼不它需要在同一個目錄?爲什麼它可以被徹底刪除並且可執行文件仍然可以運行?例如,我自己的庫和SDL有什麼區別?
當我在C++上編譯SDL項目時,它會爲我創建一個可執行文件。當我運行該可執行文件時,如果我在同一個目錄中沒有SDL.dll,它將不起作用。我明白,因爲它需要找到所有正在使用的庫和API。編譯器編譯也包含了嗎?
但是當我創造我自己的圖書館,包括它的代碼,爲什麼不它需要在同一個目錄?爲什麼它可以被徹底刪除並且可執行文件仍然可以運行?例如,我自己的庫和SDL有什麼區別?
是什麼編譯器編譯是一個翻譯單元,或編譯單元。這包括每個cpp文件的標題。
然後你有鏈接器。這將您編譯的代碼鏈接成可用的表單。
的.DLL文件很可能是搜索和當包含您的應用程序運行。
當您使用自己的圖書館,你可能包含到您的鏈接步驟程序。 (靜態鏈接)您可以刪除它,因爲它不再需要。
(因爲你給的細節是有點不清楚 - 這可能是也可能不是故事的全部)
我不是專家,但我認爲這個信息可能是
編譯依賴於有用使用compilator但是它通常需要4個步驟,這是GCC的一個例子:
在第一步驟中的compilator替換包括生成.i文件,該文件具有包括頭但不是那些的執行。
在編譯步驟中,編譯器處理.i文件並輸出.s文件,該文件包含翻譯成裝配方案,沒有實現尚未。
在第三步驟中,.s文件被翻譯成機器代碼,生成.OBJ二進制文件(因爲a.out的已過時通常在ELF格式中,文件擴展名是隻是傳承)
在第四步驟中,所有.obj文件都與其他.obj和靜態庫鏈接,在這裏,所有這些文件的代碼都合併到最終的可執行文件中。
如果有未實現的功能,但根據需要在鏈接步驟一dynlib已申報鏈接和運行後,程序將尋找它的主機,這就是正在發生的事情向你SDL。
有2個可能的修復您的問題。
(正確)將SDL2.dll與您的二進制文件一起運輸並在安裝中進行設置。
(不知錯)建立SDL靜態OBJ和與二進制建立一個獨立的可執行文件
祝你好運鏈接它;)
你編譯自己的庫作爲靜態庫? – tkausl
我的意思是我自己的頭文件和cpp文件。 –