使用Visual Studio 17
我用相同的解决方案编写了一个C ++。exe和一个dll的另一个项目。 我打算使用DLL项目链接到我的C ++。exe应用程序,而DLL能够引用我的C ++。exe项目中的类和函数。
我遇到了一些麻烦,因为当我构建解决方案时,DLL项目要求链接到创建的C ++。obj对象。我有什么方法可以使用C ++可执行文件中的功能而无需使代码复杂化?
最佳 本
答案 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的可执行文件放在第三个项目中,并从第二到第一,第三到第二。