好吧,这是问题所在.为了提高我对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特有的.这是真的?在哪种情况下,在其他操作系统上使用什么是相当不错的?
最佳答案 当你构建一个dll时,你也会创建一个公司的.lib文件,即’implib’.您必须在exe中静态链接此文件.
编辑:__ cdeclspec(…)确实是微软.不知道其他平台.