在C中创建一个DLL并从C++项目链接它

Man*_*lio 7 c c++ dll linker

根据标题,我正在尝试使用C构建DLL并从C++项目链接它.我在互联网上阅读并阅读了不同的教程,但每次都有遗漏的东西,我不明白什么.

这是我一步一步做的:

我创建了一个新的Win32项目,命名testlib,然后,从向导,我选择"DLL"和"空项目".

添加了标题:

//testlib.h

#include <stdio.h>

__declspec(dllexport) void hello();
Run Code Online (Sandbox Code Playgroud)

添加了一个来源; 因为我希望它是一个C源我读过,我应该简单地重命名.c中的.cpp文件,所以

//testlib.c

#include "testlib.h"

void hello() {
    printf("DLL hello() called\n");
}
Run Code Online (Sandbox Code Playgroud)

构建成功.

现在我想在另一个项目中使用我有用的dll.

然后:新项目(testlibUse).这次我选择了"空项目".
无需添加标头,只需创建一个cpp源

//main.cpp
#include <testlib.h>

int main() {
    hello();
}
Run Code Online (Sandbox Code Playgroud)

然后:

  • 我将路径添加到testlib.dllProperties-> VC++目录 - >可执行目录中的文件夹

  • 我添加了文件夹的路径,其中testlib.h包含Properties-> VC++目录 - >包含目录

  • testlib.lib在Properties-> Linker-> Input-> Additional dependencies中添加了(包含的扩展名)的路径

我尝试构建但是我遇到了一个链接器错误:

LINK:C:\ path\testlibUse\Debug\testlibUse.exe未找到或未由最后一个增量链接构建; 执行完整链接
main.obj:错误LNK2019:未解析的外部符号"void __cdecl hello(void)"(?hello @@ YAXXZ)在函数_main中引用
C:\ path\testlibUse\Debug\testlibUse.exe:致命错误LNK1120:1未解决的外部

如果我回去testlib,重命名回testlib.ctestlib.cpp重建的dll,那么我能够建立testlibUse,但我在运行时得到一个"DLL未找到"错误.

我还尝试在"Release"中更改两个项目的配置(更改所需的路径),但没有任何改变.

对于长篇文章感到抱歉,但我认为有必要写下我的确切做法.

有什么建议?

此外,如果我想在Qt项目中使用我的dll,是否需要更改任何配置参数?

Ada*_*eld 10

你有几个问题:

  1. 头文件应将函数标记为在DLL中编译时导出,但在由库用户编译时导入.
  2. extern "C"当编译为C++时,头文件应该将函数声明包装在一个块中,以确保名称不会被破坏
  3. DLL不在您的可执行文件的库搜索路径上,因此在运行时无法找到它.

要修复(1)和(2),请像这样重写标题:

#ifdef __cplusplus
extern "C" {
#endif

// Assume this symbol is only defined by your DLL project, so we can either
// export or import the symbols as appropriate
#if COMPILING_MY_TEST_DLL
#define TESTLIB_EXPORT __declspec(dllexport)
#else
#define TESTLIB_EXPORT __declspec(dllimport)
#endif

TESTLIB_EXPORT void hello();
// ... more function declarations, marked with TESTLIB_EXPORT

#ifdef __cplusplus
}
#endif
Run Code Online (Sandbox Code Playgroud)

要修复(3),请将DLL复制到与可执行文件相同的文件夹中.您正在设置的"可执行目录"设置不会影响DLL搜索 - 有关如何搜索DLL的详细说明,请参阅MSDN.最适合您的解决方案是将DLL复制到可执行文件所在的目录中.您可以手动执行此操作,也可以为项目添加生成后步骤,以便为您执行此操作.

  • @MohammedNoureldin:*所有* C++ 编译器在编译 C++ 代码时都会自动定义 `__cplusplus` 宏。自 1998 年以来的所有 C++ 标准都要求它。 (2认同)