我有带有代码的dll:
Dll.h:
#ifndef EXPORT
#define EXPORT __declspec(dllexport)
#endif
#ifndef IMPORT
#define IMPORT __declspec(dllimport)
#endif
#include <iostream>
#ifndef MY_GLOBALS_H
#define MY_GLOBALS_H
EXPORT extern int test;
EXPORT void pritnTestHpp() {
std::cout << "HPP:" << test << " Pointer=" << (unsigned)(&test) << std::endl;
}
EXPORT void pritnTestCpp();
#endif
DLL.cpp:
#include "Dll.h"
EXPORT int test = 0;
void pritnTestCpp() {
std::cout << "CPP:" << test << " Pointer=" << (unsigned)(&test) << std::endl;
}
主要.cpp:
#include <iostream>
#include "Dll.h"
__declspec(dllimport) int test;
int main()
{
test = 4;
pritnTestHpp();
pritnTestCpp();
std::cout << "GUI:" << test << " Pointer=" << (unsigned)(&test) << std::endl;
}
接收输出:
HPP:4指针=3092644928
CPP:0 指针=3991531888
GUI:4指针=3092644928
我想知道,为什么.cpp中是另一个指针。 Visual Studio 中的链接有效,我不知道有任何错误。
我凭记忆引导自己并搜索: 我可以从 DLL 导入全局变量吗?我可以使用 DEF 文件执行此操作吗? 从DLL导出全局变量
看起来是一样的,但对我来说不起作用。你能告诉我为什么吗?
这并不难,你只需要知道你在做什么。这就是为什么建议阅读枯燥的一般教程。
无论如何,这里有一些工作代码,后面是一些重要的构建注释。
dll.h
#pragma once
#ifdef DLL
#define EXPORT __declspec(dllexport)
#else
#define EXPORT __declspec(dllimport)
#endif
#include <iostream>
EXPORT extern int test;
inline void printTestHpp() {
std::cout << "HPP:" << test << " Pointer=" << &test << std::endl;
}
EXPORT void printTestCpp();
dll.cpp
#include "Dll.h"
int test = 0;
void printTestCpp() {
std::cout << "CPP:" << test << " Pointer=" << &test << std::endl;
}
主.cpp
#include "dll.h"
int main()
{
test = 4;
printTestHpp();
printTestCpp();
std::cout << "GUI:" << test << " Pointer=" << &test << std::endl;
}
输出
HPP:4 Pointer=00007FFB6AB2D170
CPP:4 Pointer=00007FFB6AB2D170
GUI:4 Pointer=00007FFB6AB2D170
现在重要的构建注意事项是,预处理器符号
DLL
必须在构建DLL时定义,而不是在构建主程序时定义。您在尝试中似乎缺少了这个技巧。其次,构建 DLL 将导致创建导入库(称为 dll.lib)。您必须将此导入库链接到您的主程序,否则您将得到无法解析的符号。
希望这有帮助。