如何在库加载时将预处理器定义传递给 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的主要内容,如果未能解决你的问题,请参考以下文章