【发布时间】:2015-08-25 22:15:28
【问题描述】:
假设我有这样的项目依赖:
- 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 是否为这个问题提供了一个合理、可维护的解决方案?
【问题讨论】:
标签: c++ dll c++builder dynamic-loading c++builder-xe8