如何从C代码正确创建DLL并在C ++项目中使用它

时间:2017-12-13 00:48:40

标签: c++ c dll

我有一组用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。

然后我告诉VS中的C ++项目在哪里找到myCproj.lib和myCproj.h并将DLL复制到我的C ++可执行文件所在的目录。为了使用DLL,我给myCPPproj.cpp添加了以下内容:

#define DLLImport __declspec(dllimport)

struct DLLImport neededStruct input;
input.a = 0;

extern "C" DLLImport void neededFunc( &input );

然而,我得到错误EO335'最后一行不允许'链接规范'。我做错了什么?

1 个答案:

答案 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项目时完全相同。