根据我的主要可执行文件的构建类型(调试,发布),我想链接到我的DLL的匹配版本。使用C ++ Builder IDE实现此目的的正确方法是什么?
详细信息:我使用的是Embarcadero C ++ Builder XE8(试用版,BCC64)。我的软件包含一个可执行文件和多个库(.dll,Dynamic-link Library)在程序启动期间加载(不是在运行时)。每个库和可执行文件都有自己的项目,所有项目都在同一个项目组中。
要在使用项目中使用已编译的库,我已将import files of the compiled DLLs(.a for 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文件。
我宁愿不诉诸丑陋的黑客,比如将生成的二进制文件放在同一文件夹中,只是为了获得两个版本的导入文件的单一路径。 以下解决方法似乎有效,但在保存项目时被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>
有没有理智的方法来解决这个问题?
答案 0 :(得分:1)
正如评论中所提到的,一种可能的解决方案是:
您可以使用其中一个源文件中的#pragma link
指令链接它们,而不是将lib / a文件添加到项目中。您可以使用#ifdef
指令将其包围起来,以控制哪些文件可以链接到哪些条件,您可以在项目选项中定义。
类似的东西:
#ifdef DEBUG
#pragma link "mydebulib.a"
#else
#pragma link "myreleaselib.a"
#endif
答案 1 :(得分:0)
每个库和可执行文件都有其自己的项目,所有项目都在同一项目组中
我会选择:
Logger.a
通过这种方式,如果您在库中进行了某些更改,然后尝试构建可执行文件,则C ++ Builder会自动重建pragma link
(#pragma link
中不会发生)。
还要考虑在#pragma comment
/ .lib
语句中命名的文件不应包含文件扩展名。编译器将在目标Win32
/ .a
然后目标Win64
时附加适当的代码:$(PLATFORM)
。
如前所述,库路径本身可以在项目选项中指定,其中可以使用$(CONFIG)
和IBD (Ulcerative colitis), remission phase
。