【发布时间】:2015-08-24 15:17:37
【问题描述】:
根据我的主要可执行文件的构建类型(调试、发布),我想链接到我的 DLL 的匹配构建。使用 C++Builder IDE 完成此任务的正确方法是什么?
详细信息:我正在使用 Embarcadero C++Builder XE8(试用版,BCC64)。我的软件由一个可执行文件和多个库(.dll,Dynamic-link Library)在程序启动期间(而不是在运行时)加载。每个库和可执行文件都有自己的项目,所有项目都在同一个项目组中。
为了在消费项目中使用已编译的库,我已将import files of the compiled DLLs(BCC64 的.a)添加到消费项目中。
SerialPort.cbproj 节选:
<LibFiles Include="..\..\Win64\Debug\Logger.a" Condition="'$(Platform)'=='Win64'">
<BuildOrder>3</BuildOrder>
<IgnorePath>true</IgnorePath>
</LibFiles>
不幸的是,.dll/.a 文件的输出路径取决于变量 $(Platform) 和 $(Config),因此这些文件的路径在调试和发布版本之间有所不同。 IDE 不允许(!?)指定用于调试和发布版本的不同 DLL 文件。
我宁愿不采用丑陋的技巧,例如将生成的用于调试和发布模式的二进制文件放在同一个文件夹中,只是为了为两个构建提供一个导入文件的单一路径。 以下解决方法似乎有效,但在保存项目时被 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>
有没有一种理智的方法来解决这个问题?
【问题讨论】:
-
我可能是错的,但我知道当您在调试模式下编译 .exe 时,它会查看调试路径,而当您在发布模式下编译时,它会查看发布路径。它不是为你做的吗?
-
一个EXE项目也有
$(Platform)和$(Config)变量。因此,如果 DLL、它们的导入 LIB 和 EXE 都基于构建配置编译到同一个文件夹中,那么只要 DLL/LIB 对每个配置使用相同的文件名,一切都应该正常工作。 -
我有 (!?) 指定要在消费项目中使用的 .a 文件。因此,当 dll 和 exe 在构建后最终在同一目录中时,它并没有帮助。
-
您可以使用
#pragma link宏,而不是直接将库添加到项目中。这样你就可以通过一个简单的#define来控制它,你可以在项目配置中指定它。 -
@RodrigoGómez:谢谢,这是一个非常有用的解决方法。在提出更好的解决方案之前,我会继续这样做。
标签: c++ dll c++builder