c++ - 内河码头 C++Builder : Separate debug/release DLL references possible?

标签 c++ dll c++builder

根据我的主可执行文件的构建类型(调试、发布),我想链接我的 DLL 的匹配构建。使用 C++Builder IDE 完成此操作的正确方法是什么?

详细信息:我正在使用 Embarcadero C++Builder XE8(试用版,BCC64)。我的软件由一个可执行文件和多个在程序启动期间(而不是运行时)加载的库(.dll, Dynamic-link Library )组成。每个库和可执行文件都有自己的项目,并且所有项目都在同一个项目组中。

为了在使用项目中使用编译的库,我添加了 import files of the compiled DLLs (.a 对于 BCC64)到消费项目。

摘自 SerialPort.cbproj:

<LibFiles Include="..\..\Win64\Debug\Logger.a" Condition="'$(Platform)'=='Win64'">
    <BuildOrder>3</BuildOrder>
    <IgnorePath>true</IgnorePath>
</LibFiles>

不幸的是,.dll/.a 文件的输出路径取决于变量 $(Platform) 和 $(Config),因此这些文件的路径在调试版本和发布版本之间有所不同。 IDE 不允许我指定不同的 DLL 文件用于调试和发布版本。

我宁愿不诉诸丑陋的黑客,比如将生成的用于调试和 Release模式的二进制文件放在同一个文件夹中,只是为了两个构建的导入文件有一个路径。 以下解决方法似乎有效,但在保存项目时被 C++Builder 覆盖:

<LibFiles Include="..\..\Win64\Debug\Logger.a" Condition="('$(Platform)'=='Win64') And ('$(Config)'=='Debug')">
    <BuildOrder>3</BuildOrder>
    <IgnorePath>true</IgnorePath>
</LibFiles>
<LibFiles Include="..\..\Win64\Release\Logger.a" Condition="('$(Platform)'=='Win64') And ('$(Config)'=='Release')">
    <BuildOrder>3</BuildOrder>
    <IgnorePath>true</IgnorePath>
</LibFiles>

有没有一个合理的方法来解决这个问题?

最佳答案

正如评论中提到的,一种可能的解决方案是:

您可以在源文件之一中使用 #pragma link 指令来链接它们,而不是将 lib/a 文件添加到项目中。您可以使用 #ifdef 指令包围它,以控制在哪些条件下链接哪些文件,您可以在项目选项中定义这些条件。

类似于:

#ifdef DEBUG
  #pragma link "mydebulib.a"
#else
  #pragma link "myreleaselib.a"
#endif

关于c++ - 内河码头 C++Builder : Separate debug/release DLL references possible?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30738245/

相关文章:

c# - 如何在不将整个 DLL 复制到内存的情况下读取 DLL 插件中的 MEF 元数据?

c++ - std::runtime_error 中的显式构造函数

c++ - asio::io_service 和 thread_group 生命周期问题

c++ - Qt、Qmake 和 Visual Studio 2013

c++ - UxTheme.dll 的函数原型(prototype)类型/声明 - 动态加载

c++ - _matherr 不会在发布版本中被调用(C++ Builder 2007)

android - C++Builder:如何在 Android 应用程序中显示重音?

c++ - Visual Studio 2010下的Socket编程,非托管C++

c++ - 如何通过单次运行将多个输入样本提供给 C++ 中的 tensorflow 模型

python - 带有回调 : access violation on exit 的 ctypes