如何在库加载时将预处理器定义传递给 DLL

Posted

技术标签:

【中文标题】如何在库加载时将预处理器定义传递给 DLL【英文标题】:How can I pass a preprocessor definition to DLL at library load time 【发布时间】:2019-04-11 04:36:04 【问题描述】:

我正在开发一个链接到 DLL 的应用程序,该 DLL 本身包含一个数据结构,其定义因预处理器定义而异:

struct Example

    uint8_t StringA[32];
    #if USE_B
    uint8_t StringB[32];
    #endif
;

我需要在我的应用程序中的不同时间使用这两个版本的结构。因此,似乎我需要使用 LoadLibrary 加载 DLL,其中未定义 USE_B 用于部分执行(这是标准且简单的),使用 FreeLibrary 卸载它,然后使用定义为非零的 USE_B 再次加载它价值。我不确定如何执行此操作,如果有任何帮助,我将不胜感激。

【问题讨论】:

将代码更改为具有两个版本的结构 【参考方案1】:

LoadLibrary/FreeLibrary 是运行时概念,#ifs 是编译时概念。如果你编译一个没有定义 #if 的模块,无论你如何加载或重新加载它,它都会保持原样。

定义两个类,一个使用StringA,一个继承使用StringB

然后向该类添加一个虚函数,使其具有多态性,并在运行时使用dynamic_cast<> 决定你想要两者中的哪一个。

【讨论】:

【参考方案2】:

您需要编译具有不同标志值的 DLL 的两个版本。然后,您可以通过动态加载所需的版本从二进制文件中使用它们。

【讨论】:

以上是关于如何在库加载时将预处理器定义传递给 DLL的主要内容,如果未能解决你的问题,请参考以下文章

如何将变量传递给自定义 Django 模板加载器?

使用预处理器指令定义输出路径

将预处理器变量传递给 nmake 构建环境

C#如何获取已定义预处理器的列表?

作为由相对路径加载的绝对路径传递给链接器的动态库?

将自定义尾风配置文件传递给 postcss 加载器