簡體   English   中英

C ++ DLL無法鏈接?

[英]C++ DLL won't Link?

好,這是問題。 為了提高我對C ++ API的了解,我嘗試了解有關庫文件類型的更多信息。 我有很好的靜態庫。 您只需將庫鏈接到項目,並且在編譯和鏈接庫時將其內容放置在二進制文件中。 但是,當我開始嘗試使用動態庫時遇到了一個問題。 我能夠使用__declspec函數成功編譯DLL文件,並創建外部塊(因此可以將其成功導出到C ++)。 但是,當我嘗試鏈接文件時會出現問題。 基於我在網上看到的多個教程,我創建了帶有正向定義的標頭,並將其包含在可執行項目中。 然后,確保將搜索目錄以及要導入的庫的路徑添加到項目構建設置中。 然后,當我去構建項目時,它會產生一個鏈接器錯誤(我可以知道,因為目標文件已編譯)“找不到-l [文件路徑]”。 還有更多配置嗎? 我認為這與我的編譯器(MinGW)有關,因為Code :: Blocks(我目前正在使用Eclipse CDT插件)產生了類似的鏈接錯誤。

如果您需要查看代碼,我將在下面提供。

// EXE: main.cpp
#include <iostream>
#include "DLLTutorial.h"

int main()
{
    Function();
    std::cout << "1 + 3:\t" << Add(1, 3);
}


// DLL: DLLTutorial.cpp
#define DLL_EXPORT
#include <iostream>
#include "DLLTutorial.h"

extern "C"
{
    DLLCOMP int Add(int a, int b)
    {
        return a + b;
    };

    DLLCOMP void Function(void)
    {
        std::cout << "DLL Called!\n";
    };
};


// DLL: DLLTutorial.h
#ifndef DLLTUTORIAL_H_
#define DLLTUTORIAL_H_

#include <iostream>

#ifdef DLL_EXPORT
    #define DLLCOMP __declspec(dllexport)
#else
    #define DLLCOMP __declspec(dllimport)
#endif

extern "C"
{
    DLLCOMP int Add(int a, int b);
    DLLCOMP void Function(void);
};


#endif /* DLLTUTORIAL_H_ */

這只是我在網站上使用的非常簡單的示例代碼。 我無法使可執行文件正確鏈接,因此,我將不勝感激。

另外,我有一個相關的問題。 在線閱讀一些教程,其中一些提到__declspec函數是Windows / Microsoft特定的。 這是真的? 在這種情況下,在其他操作系統上使用什么等效?

生成dll時,還會創建一個公司.lib文件,即“ implib”。 您必須在exe中靜態鏈接此文件。

編輯:__cdeclspec(...)確實是Microsoft。 不了解其他平台。

您需要告訴編譯器在哪里搜索您的庫和包含文件。 在GCC和MinGW中,這都是通過使用-I包含(include)和-L (libraries)來實現的。 我認為您無需生成.lib(或.a,因為它通常在* nix和GCC中),GCC應該能夠在dll中找到您的函數。

例如,構建並鏈接共享庫:

g++ -shared -olibmy_dll.dll my_dll.cpp

然后,假設所有文件都在同一個目錄中,構建並鏈接該exe,並告訴GCC使用您的lib:

g++ -oapp.exe app.cpp -lmy_dll -L.

注意-l-L之間的區別,一個告訴GCC使用什么庫,而另一個告訴在哪里尋找它們。 在Eclipse CDT中,您可以在以下位置找到這些設置:項目屬性-> C / C ++構建->設置-> MinGW C ++鏈接器->庫。

另外, __declspec被MinGW識別,但是無論如何我認為它是Microsoft特有的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM