好的,这是问题所在。为了提高我对C ++ API的了解,我试图了解有关库文件类型的更多信息。我有很好的静态库。您只需将库链接到项目中,并在编译和链接时将其内容放在二进制文件中。但是,当我开始尝试使用动态库时,我遇到了一个问题。我能够使用__declspec函数成功编译DLL文件,并创建extern块(因此可以成功导出到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特有的。这是真的?在这种情况下,在其他操作系统上使用什么是相当不错的?
答案 0 :(得分:2)
当你构建一个dll时,你也会创建一个公司的.lib文件,即'implib'。您必须在exe中静态链接此文件。
编辑:__ cdeclspec(...)确实是微软。不知道其他平台。答案 1 :(得分:0)
您需要告诉编译器在哪里搜索您的库和包含。在GCC和MinGW中,通过使用-I
表示包含,-L
表示库来实现。我不认为你有必要生成.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中,您可以在以下项目中找到以下设置:项目属性 - &gt; C / C ++ Build - &gt;设置 - &gt; MinGW C ++ Linker - &gt;库。
此外,__declspec
被MinGW认可,但我认为它的微软特定。