【发布时间】:2010-12-06 00:45:17
【问题描述】:
好的,问题来了。为了提高我对 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 特定的。这是真的?在这种情况下,在其他操作系统上使用什么会更好?
【问题讨论】:
标签: c++ dll linker eclipse-cdt