实际上它是工程代码内联式的解决方案,即便模块再嵌套子模块它始终都属于用户项目内的一整个文件夹,所以对于子模块的版本管理只是顺带在其封闭区域内的,不应扩散到全局系统性的版本问题,为了达到这个目标,白易作者进行了如下探索...
现在已经有模块0(当中实现f0),然后模块1和模块2各自都引入了模块0,那么这里模块1和模块2都各自有f0的副本,当一个主程项目又同时引入模块1和模块2时,假若模块0本身没有设计为inline,那么这里主工程必定导致符号重定义。
之所以不设计为inline一个合理的理由是加快编译速度(不同编译单元只引用其声明头文件,源定义在别处,这也是传统C++开发方式),加快链接期速度(因为inline会触发COMDAT机制链接器要在多个定义副本中抉择其一,如果没有inline则省去这一过程),再来一个开发中的原因就是多写个inline其实真的很烦也不够优雅~
而白易在模块设计机制上,就允许你只专心开发源文件,而头文件解析生成的事情交给MakeBEC插件,从而有纯天然的高效且优雅的C++开发体验。
就算是inline方案也未必真的能完全解决多个模块项目之间的冲突问题,试想如果我模块1就绑死依赖了模块0的1.0版本,模块0的1.0与2.0已经有版本上的“大换血级”的不同实现(虽然f0符号还是那个符号),而模块2依赖的是模块0的2.0版本,那么请问现在主程项目中同时引入模块1和模块2,那么f0还能否真的可以inline?
由于C++是分布式的编译体系(根本原因我也可以一针见血指出C++的符号链接的空间是全局扁平的,如果允许有某种机制让各自模块的链接范围仅限定绑定在其子目录中的话),那么对于这个版本管理问题即便是inline还真的无解;
并且就算是到 C++20 Modules 依然也没有解决这个问题~(你要不信的话,我已经帮你测了)
故,在不同的嵌套项目的版本管理之间很难说不出问题。。。
加入命名空间符号改编,这个说起来简单,实现起来还是有一定说法
分为两种形式改编:源代码级、二进制lib库级
注意:以下改编仅Pro版支持:当一个模块工程内去引入一个子模块时将弹出改编提示,免费版不会显示该界面 默认也不会进行改编;
若是一个主项目工程该改编提示的窗口并不会弹出,若主程遇到符号问题可先另开模块工程去实现符号改编做成子模块形式(主模块内无需套娃再做一层函数封装,本身子模块改编后就是目标符号了)再导入进主程项目即可使用改编后的模块。
以下是以主模块内嵌套子模块依赖的改编示例:











、







那上边你这一说了都是基于C++的,那C语言怎么办?
纯C的话本身也是能改编符号,但没有命名空间这样非常方便的机制,对于非C++源码以及非MSVC编译的C++lib库白易的策略是——只要当前工程是属于模块开发环境(非主程环境)那么在导入子模块时一律直接禁止!(后期会再考虑加入纯C库的符号改编策略,目前对于纯C库的封装我是建议你做成系统模块库——纯C库本身比较适合这个场景)
现在源代码级的模块弹窗告知;
对于lib级的模块弹窗告知:
PS:白易在0.5之后已经计划pro版(预计26年底随1.0 Pro版发布)实现C库的lib级符号改编,尽请期待~
当然作者自己已经有实现过的内部案例:白易模块注释级指令.mht#beExcludeNamespaceSymbol

对于release版本下且开启了全程序优化选项进行的模块编译,它的obj文件并非是标准的COFF格式,它里边的代码实现也并非是目标平台上面向CPU的二进制机器码,而是MSVC当前编译器下的中间字节码!
LTCG搞出的obj格式网上没有任何公开的资料,
也对,易语言支持库开发那会想起来为什么要关掉这个全程序优化了。。
关于这点微软本身也做了解释:
且与.NET那种IL中间语言又还不是一回事,属于每个编译器自带语言
而且这玩意微软也明确说它还存在不同VC之间(即便是2015以上,即便还是同个大版本下的子版本)
看来得禁止用户套这种release版的静态库模块了,除非有源代码或者关闭全程序优化的release静态库否则现有公开的工具没法改名,并且跨只要是不同的VC编译器版本也都还会存在ABI兼容问题,事情可谓非常严重!
故白易在进行BE模块工程初始模板里,就已经写死把release发布版下的配置中把全程序优化(LTCG)的选项给否掉了
参考:
底层原理之链接期的延迟代码生成:https://learn.microsoft.com/en-us/archive/msdn-magazine/2002/may/under-the-hood-link-time-code-generation
Visual Studio 版本之间的 C++ 二进制兼容性:https://learn.microsoft.com/en-us/cpp/porting/binary-compat-2015-2017?view=msvc-170