2013-03-09 112 views
7

我正在嘗試啓動C++遊戲引擎項目。因爲.lib文件丟失,無法引用庫項目(DLL)

我對dll和lib沒有太多的瞭解,但認爲引擎本身就是一個dll,我會分開dll項目,比如渲染器,輸入等等,這些將被引擎和引擎dll使用被遊戲使用。

我似乎在demo.exe項目中引用了很好的引擎項目(通過添加引用並將路徑添加到其他包含目錄中),但試圖在引擎dll項目中添加對渲染器dll項目的引用時我越來越:

錯誤LNK1104:無法打開文件 'mypath中\ Renderer.lib' mypath中\ LINK 引擎

爲什麼提庫?

+0

的可能重複[如何製作的.lib文件有一個.dll文件和一個頭文件時(http://stackoverflow.com/questions/9360280/how-to-make-a-lib -file-and-a-header-file) – jww 2014-11-17 06:53:24

回答

2

一般來說,

庫可能給你它的API有兩種模式:

  • 動態:更小的可執行文件,但需要它的DLL。

  • 靜態:較大的可執行文件,但是是獨立的。

首先,決定如何靜態或動態地使用該庫?然後配置您的項目,編譯器能夠找到該庫的頭文件。 然後如果有必要添加LIB文件到您的項目。

你的情況:檢查你是否正確添加LIB文件到你的項目或生成文件,或不?

+0

我很高興能夠動態地做到這一點,這種方式如果我發佈了一款遊戲,它會隨相應的dll的含義發佈,讓它更容易如果需要更新和修改。在這種情況下,我的Renderer dll項目沒有創建一個lib文件,只有一個dll,ilk和pdb文件。我剛剛注意到,在我的渲染器的項目引用屬性(在引擎屬性的框架和引用選項卡下)下,它有一個鏈接庫依賴項設置爲true的選項時,它似乎構建,如果我將它設置爲false,但這是否意味着很多? – EvilWeebl 2013-03-09 17:26:54

2

在DEMO.EXE項目中引用罰款(通過添加引用並添加路徑附加包含目錄)發動機項目

一些圖書館可以靜態鏈接,這意味着你需要只有頭文件(.h/.hpp)和.lib文件。其他庫可能需要動態鏈接,這將導致您的程序依賴於某些DLL文件,但通常您需要擁有頭文件才能知道這些DLL中的內容。有時候,這似乎是你的情況,你需要所有這些:頭文件,靜態庫和DLL。

頭文件包含聲明,他們定義類的結構,他們申報的功能等靜態庫.lib文件)的二進制文件,包含你的函數定義,變量等原型,這需要在編譯時解決,所以當他們失蹤時,鏈接器會發出抱怨。 動態鏈接庫(DLL)也是二進制文件,但它們在運行時解析,這意味着當你真正需要它們的時候是運行程序時。

9

許多DLL都帶有相應的LIB庫,僅在鏈接階段需要。所以基本上有兩種類型LIB庫:

包含所有的目標文件

  • 圖書館只爲連接器定義

    1. 真實靜態庫,這種庫自帶的DLL

    所以基本上你需要鏈接這個LIB文件,以便能夠使用DLL

  • +1

    我無法找到任何地方創建任何.lib文件。如果我將例如我想包含在我的引擎dll項目中的renderer dll項目。渲染器生成良好,並將* .dll,* .ilk和* .pdb輸出到我的(解決方案)/ Debug文件夾中。另外,我的(解決方案)/ Renderer/Debug文件夾中有文件,例如* .obj。我應該在哪裏鏈接?另外,當它最終成爲一個安裝項目時,我只需要dll或連接器呢? – EvilWeebl 2013-03-09 17:10:02

    +0

    在我的情況下,包含* .obj文件的文件夾也包含* .lib,但其他項目在其中找不到它... – 2013-12-03 17:48:27

    3

    所以我排序我的問題。由於他們是新項目,他們還沒有實現方法,所以沒有創建庫,所以沒有什麼可以參考..silly我。

    但最後一件事,我無法爲頭文件定義dllimport/dllexport宏。我試圖讓它定義dllexport當其出口項目,但說我的項目是2名稱,例如「真棒引擎」,那麼我如何才能意識到顯然是自動創建的導出宏?我應該爲這個空間使用下劃線嗎?

    #ifdef AWESOME_ENGINE_EXPORTS // Or AWESOMEENGINE_EXPORTS? 
    #define DLL __declspec(dllexport) 
    #else 
    #define DLL __declspec(dllimport) 
    #endif 
    
    +0

    右鍵單擊項目,屬性,配置屬性,C/C++,預處理器。將'AWESOME_ENGINE_EXPORTS'(或任意選擇的)添加到您的DLL的預處理器定義列表中。這使得在你的dll中定義宏,導致函數被導出。其他人都沒有這個宏,所以函數將被導入。 – 2013-12-03 17:55:31