C ++ DLL引用C ++。exe中的函数和类

时间:2018-10-03 04:21:29

标签: c++ dll dllexport

使用Visual Studio 17

我用相同的解决方案编写了一个C ++。exe和一个dll的另一个项目。 我打算使用DLL项目链接到我的C ++。exe应用程序,而DLL能够引用我的C ++。exe项目中的类和函数。

我遇到了一些麻烦,因为当我构建解决方案时,DLL项目要求链接到创建的C ++。obj对象。我有什么方法可以使用C ++可执行文件中的功能而无需使代码复杂化?

最佳 本

1 个答案:

答案 0 :(得分:0)

这不需要复杂的代码(无论如何,这通常不是从DLL导出函数的常用方法)。

我怀疑您当前的问题主要是与构建环境有关,但让我们举一个快速的示例,说明您要尝试执行的事情(经过测试的代码)。

以下是具有导出功能的超简单可执行文件的代码:

1

请注意,即使不会(至少通常)不会调用它,也需要使用#include <stdio.h> #include <conio.h> extern "C" { void __declspec(dllexport) foo() { printf("in foo\n"); } } int main() { getch(); } 作为其入口点。当然,它可以改为使用main作为其入口点-无论哪种方式,它实际上都不会被使用。我们只需要满足链接器要求的东西,它就会生成可执行文件。

...这是一个标头,用于声明其导出的函数,以便其他(我们的DLL)可以使用它:

WinMain

我们可以相当正常地构建可执行文件,除了必须确保它使用DLL中的标准库(否则,其标准库将无法正确初始化,因此将无法使用):#pragma once extern "C" { void __declspec(dllimport) foo(); }

然后我们有了DLL的代码

cl /MD trash9.cpp

...这是标题:

#include "trash9.h"
#include <iostream>

extern "C" {
    void __declspec(dllexport) bar() {
        printf("in bar\n");
        foo();
        printf("back in bar\n");
    }
}

void DllMain() {}

DLL也需要在DLL中使用标准库,因此我们将其构建为:#pragma once extern "C" { void __declspec(dllimport) bar(); } cl /MD /LD trash8.cpp trash9.lib表示它应在DLL中使用标准库,而/MD则应创建一个可执行文件(而不是默认情况下的可执行文件)。

最后,这是一个使用/LD的可执行文件:

bar

我们可以这样构建:#include "trash8.h" int main() { bar(); }

运行它时,我们将获得您期望的结果:

cl /MD use_bar.cpp trash8.lib

这只剩下一个障碍:让Visual Studio同意做您想做的事。我的直接反应是,首先要做的是将可执行文件放在一个项目中,将DLL放在第二个项目中,并且(如果要处理)将使用DLL的可执行文件放在第三个项目中,并从第二到第一,第三到第二。