我有一组用C编写的函数,我需要能够从另一个用C ++编写的项目中调用它。 C代码本质上是一些在大型数据集上进行某些计算的函数。我没有写它们 - 我想要做的就是让我的C ++项目能够调用这些函数。我的解决方案是为C代码创建一个DLL并将其链接到我的C ++项目。
为了制作DLL,我构建了myCproj.h( C项目中的标题,而不是C ++项目),如下所示:
#ifdef __cplusplus
extern "C" {
#endif
struct __declspec(dllexport) neededStruct {
int a;
//I need to be able to initialize this struct in my C++ project.
}
__declspec(dllexport) void neededFunc( struct neededStruct *input ) {}
//I need to be able to call this function from my C++ project and feed
//it my local instance of neededStruct.
#ifdef __cplusplus
}
#endif
src文件myCproj.c根本没有改变。函数定义在它们前面没有__declspec(dllexport)
,也没有extern "C"
插入任何地方。代码编译时没有错误,并生成myCproj.dll和myCproj.lib。
#define DLLImport __declspec(dllimport)
struct DLLImport neededStruct input;
input.a = 0;
extern "C" DLLImport void neededFunc( &input );
然而,我得到错误EO335'最后一行不允许'链接规范'。我做错了什么?
答案 0 :(得分:1)
最好对库和使用代码使用相同的标题。 如上所述,它通常由条件定义完成,如下所示: MyLibrary.h:
#if defined(MYLIBRARY_API)
#define MYLIBRARY_EXPORTS __declspec(dllexport)
#else
#define MYLIBRARY_EXPORTS __declspec(dllimport)
#endif
#if defined(__cplusplus)
extern "C" {
#endif
MYLIBRARY_API bool MyLibFunc();
#if defined(__cplusplus)
#endif
MyLibrary.c:
#include "MyLibrary.h"
void MyLibFunc()
{
....
}
App.cpp:
#include <MyLibrary.h>
int main()
{
MyLibFunc();
}
将为库项目定义符号MYLIBRARY_API(通常作为编译器命令行上的/ D)。如果您使用visual studio,那么与创建带导出的dll项目时完全相同。