在 DLL 中导出的 C++ 函数中使用 #ifdef 块

Posted

技术标签:

【中文标题】在 DLL 中导出的 C++ 函数中使用 #ifdef 块【英文标题】:using #ifdef block inside exported C++ function in DLL 【发布时间】:2014-10-01 23:24:51 【问题描述】:

我正在尝试在导出到 DLL 的函数中使用 #ifdef 开关

我遇到的问题是我的 .EXE 项目无法更改 ifdef 定义。就像它们被预编译到 DLL 中一样,无法更改。它是否正确?我不能在导出到 DLL 的 C++ 函数中使用 #ifdef。

示例:

void API func()

   #ifdef I_WANT_THIS
      cout << "I want this" << endl;      
   #else
      cout << "I dont want this" << endl;
   #endif

如果我在构建 DLL 时没有定义任何内容,然后在 .EXE 项目中我尝试定义,I_WANT_THIS 它实际上并不适用于库中链接的 cpp 目标文件。我认为应该是这样,但我觉得我应该能够做到这一点......

【问题讨论】:

【参考方案1】:

您需要使这种功能在运行时可切换。 DLL 是已编译的代码,并且在构建它们时已经执行了任何类似的预处理。

【讨论】:

k,这就是我的想法。谢谢【参考方案2】:

是的,它们被预编译到 DLL 的代码中。 EXE 无法更改它们。要执行您正在尝试的操作,您必须:

    向函数传递一个额外的参数:

    void API func(bool param)
    
        if (param)
            cout << "I want this" << endl;      
        else
            cout << "I dont want this" << endl;
    
    

    导出两个单独的函数:

    void API doThis()
    
       cout << "I want this" << endl;      
    
    
    void API doThat()
     
        cout << "I want that" << endl;      
     
    

【讨论】:

是的,我的问题旨在减少不必要的依赖。例如,如果我有一个 Win32 应用程序类,还有一个 SDL 应用程序类,如果我什至不想与 SDL 链接怎么办?我想我已经有了新的答案:在没有 SDL 的情况下编译我的库以使其不依赖它。 如何编译两个独立的 DLL,一个用于 Win32,一个用于 SDL,并让应用程序选择使用哪一个?如果您希望它们共享一个公共代码库,则可以在编译 DLL 时使用您的#ifdefs。 真的,我能做到。我可能真的会走那条路。谢谢

以上是关于在 DLL 中导出的 C++ 函数中使用 #ifdef 块的主要内容,如果未能解决你的问题,请参考以下文章

尽管 dllimport 在两个 DLL 中导出的数据符号

如何构建在unity/c#中导入的c++ dll

从 C++ 调用 C# dll(MSVC 编译器)

在本机 C++ 项目中导入 C# dll 库

如何显示 DLL 可导出的函数

是否可以在 DLL 中导出具有 C 链接的 C++ 成员方法?