编译构建C++程序时ABI一致性问题
主程序使用 动态库或者静态库时 要保证 主程序与使用的动态库或者静态库的ABI一致;否则那怕编译通过也可能导致异常崩溃等问题
有四个方面:
1.使用的编译器版本【编译生成主程序与编译生成动态库或者静态库的编译期版本尽量保持一致】
2.debug/Release版本【主程序与动态库或者静态库的debug或者Release版本尽量保持一致】【否则可能出现ABI问题导致异常崩溃】【编译使用Abseil库时已经验证】
3.x86/x64目标平台【目标平台必须保持一致】
4.使用的C++运行时库【只针对静态库有这种情况】=>对于静态库其选择使用的MT,MTD,MD,MDD这些选项要与参与主程序编译时主程序的选项保持一致;否则静态库编译不通过;
对于动态库没有直接这样的限制要求=>即不会导致编译不通过,但是最好还是保证主程序的运行时库与动态库的运行时库一致;否则即便通过编译,也可能在运行时出现ABI异常导致程序崩溃;【编译使用Abseil库时已经验证】
【详见:https://app.yinxiang.com/fx/b4f45f90-cf69-451a-a3c1-8dff9d77d3ed】
编译静态库时 可以任意使用 MT MTD MD MDD 多线程运行时库
编译动态库时 也可以任意使用MT MTD MD MDD 多线程运行时库
多线程运行时库方面:
实际上考虑ABI一致性问题,无论在编译执行程序,动态库,静态库时=>尽量选择与编译的debug/Release版本一致的运行时库版本【即最好在Debug/Release选择上一致;而至于使用静态运行时库还是动态运行时库任意】
=>即:
根据目标项目的 Debug模式 任意选择 MTD,MDD;
根据目标项目的Release 任意选择 MT,MD;
主程序-动态库/静态库方面:
当其他工程使用 静态库时,因为静态库最终要编译打包到整个程序内部,所以 其他工程编译使用的多线程运行时库的版本要与编译静态库时使用的多线程运行时库版本一致;否则编译不通过
而对于动态库,其他工程只是调用动态库接口,动态库本身并不打包进执行程序PE文件中;所以不要求主工程与动态库编译时使用的多线程运行时库版本一致;即不会因为这个出现编译不通过问题;但是最好还是保证主程序的运行时库与动态库的运行时库一致;否则即便通过编译,也可能在运行时出现ABI问题导致程序异常崩溃;
这样从 主程序,其链接的动态库/静态库;以及这些目标使用的运行时库 三个方便都严格保证ABI一致性