[英]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.