0

假设我有这样的项目依赖项:

  • SerialPortDemo (EXE) --> SerialPort (DLL) -> ByteIo (DLL)。
  • XYZ-App (EXE) -> XYZ-Lib (DLL) -> ByteIo (DLL)

每个 DLL 项目都有两个文件夹,include并且src. include包含公共接口标头和src/实现以及非公共标头。

习惯于 CMake 的target_include_directories及其 PUBLIC、PRIVATE 和 INTERFACE 关键字,我想告诉 ByteIo 项目,它的消费者是否必须将哪个目录添加到他们自己的包含目录列表中才能使用 ByteIo 项目。这同样适用于链接库 - 同样,就像CMake 中的target_link_libraries一样。

现在,我不得不根据 ByteIo 的标头直接或间接地将 ByteIo 的包含目录手动添加到每个项目中。例如,SerialPort.dll 项目中的 SerialPort 类继承了 ByteIo.ddl 项目中定义的 ByteIo,因此项目 SerialPortDemo.exe 必须添加两个项目 ByteIo 和 SerialPort 的(公共)包含路径。即使对于上面的小例子(SerialPortDemo、SerialPort、XYZ-App 和 XYZ-Lib),这也是一种巨大的时间浪费并且非常容易出错。

不工作:

  • 选项集:太有限而无法使用,因为相对包含路径需要根据 DLL 项目的使用者项目的位置进行更改。到目前为止,我能想到的唯一解决方法是将完整路径添加到选项集中的包含路径列表中——这是不可接受的。
  • 环境变量:不是一个可接受的解决方案,因为它迫使我在一个非常特定的位置检查项目和/或拒绝我在同一台机器上多次检查项目的可能性。

Embarcadero C++Builder XE8 是否为这个问题提供了一个理智的、可维护的解决方案?

4

1 回答 1

0

现在,我不得不根据 ByteIo 直接或间接地将 ByteIo 的包含目录手动添加到每个项目中。

您只需要为直接依赖 ByteIo(SerialPort 和 XYZ-Lib)的项目添加它。其他项目(SerialPortDemo 和 XYZ-App)完全没有理由引用 ByteIo。

Embarcadero C++Builder XE8 是否提供问题的解决方案?

想到的一件事是创建一个选项集,其中包含您的共享设置,例如 ByteIo 文件夹的路径,并将其保存到.optset文件中。然后,您可以根据需要将该选项集应用于每个项目。您可以将.optset文件直接导入项目,覆盖其当前配置。或者,您可以创建对.optset文件的引用,以便多个项目可以共享它。

如果这不起作用,您始终可以创建一个自定义环境变量,将其指向 ByteIO 的包含文件夹,然后将该变量添加到每个项目的包含路径中。

于 2015-06-12T07:05:19.483 回答