导入全局变量失败 C++

问题描述 投票:0回答:1

我有带有代码的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导出全局变量

看起来是一样的,但对我来说不起作用。你能告诉我为什么吗?

c++ dll global
1个回答
0
投票

这并不难,你只需要知道你在做什么。这就是为什么建议阅读枯燥的一般教程。

无论如何,这里有一些工作代码,后面是一些重要的构建注释。

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)。您必须将此导入库链接到您的主程序,否则您将得到无法解析的符号。

希望这有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.