【问题标题】:Embarcadero C++Builder: Transitive project dependencies and includes?Embarcadero C++Builder:传递项目依赖和包含?
【发布时间】:2015-08-25 22:15:28
【问题描述】:

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

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

每个 DLL 项目都有两个文件夹,includesrcinclude 包含公共接口标头和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 是否为这个问题提供了一个合理、可维护的解决方案?

【问题讨论】:

    标签: c++ dll c++builder dynamic-loading c++builder-xe8


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 1) 在我的例子中,SerialPort 库包含一个类 Serialport,它继承自 ByteIo 库中的类 ByteIo。因此,Serialport 的每个使用者也必须包含 ByteIo 标头的路径。 2) 谢谢提示,周一去试试。
    • 我已经更新了问题并解释了为什么选项集不起作用。
    • 环境变量也不是一个可接受的解决方案,因为它迫使我在一个非常特定的位置签出项目和/或拒绝我在同一台机器上多次签出项目的选项.
    猜你喜欢
    • 2020-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-27
    • 1970-01-01
    • 2017-04-30
    • 1970-01-01
    相关资源
    最近更新 更多