Meson交叉编译中如何配置原生子项目?
Meson交叉编译中如何配置原生子项目?
嘿,这个问题我之前刚好处理过,能帮你捋清楚!你现在遇到的核心问题是:虽然测试可执行文件和依赖库都标记了native: true,但通过wrapdb引入的Catch2子项目默认还是会用交叉编译的配置构建,导致原生测试程序和交叉编译的Catch2依赖不兼容,触发错误。
解决思路很明确——强制Catch2子项目以原生环境构建,具体可以这么调整你的Meson脚本:
project('demo', 'cpp', default_options: [ 'cpp_std=c++20' ]) # 手动引入Catch2子项目,显式指定native=true确保用主机编译器构建 catch2_sub = subproject('catch2', native: true, default_options: [ 'tests=false' ]) # 从原生子项目中获取所需的依赖对象 catch2 = catch2_sub.get_variable('catch2_with_main_dep') uut_lib = static_library('uut', 'uut.cpp', native: true) uut_inc = include_directories('.') uut = declare_dependency( link_with: [ uut_lib ], include_directories: [ uut_inc ] ) test('test1', executable('test1', 'test1.cpp', dependencies: [ uut, catch2 ], native: true ) )
为什么这么改能解决问题?原来的dependency()函数里的native: true只是告诉Meson“我需要一个原生环境的依赖”,但当fallback到子项目时,Meson并不会自动把这个子项目标记为原生构建。而用subproject()函数显式加上native: true参数,就会强制Catch2子项目使用主机系统的编译器和环境来构建,完全匹配你的原生测试程序的需求,依赖链统一后,交叉编译时的错误自然就消失了。
备注:内容来源于stack exchange,提问作者Simon Richter
相关产品推荐
相关产品推荐

