xmake
xmake copied to clipboard
mkl link issue
注:如果是
问题报障或者特性请求,请选择报告缺陷,特性请求模板,否则一律不回复。
描述讨论详情
现在mkl链接时报错
libmkl_core.a(_avx_z__trmm_rut.o): in function `mkl_blas_avx_ztrmm_rut':
_trmm_rut.f:(.text+0xd603): undefined reference to `mkl_blas_zaxpy'
原因是package里面链接是按顺序链接:
-lmkl_lapack95_ilp64 -lmkl_blas95_ilp64 -lmkl_intel_ilp64 -lmkl_tbb_thread -lmkl_core -ltbb -ltbbmalloc
但mkl有循环依赖,MKL Link Line Advisor要求必须用group链接:
-lmkl_blas95_ilp64 -lmkl_lapack95_ilp64 -Wl,--start-group ${MKLROOT}/lib/intel64/libmkl_intel_ilp64.a ${MKLROOT}/lib/intel64/libmkl_tbb_thread.a ${MKLROOT}/lib/intel64/libmkl_core.a -Wl,--end-group -ltbb -ltbbmalloc
所以需要等package也支持group linking ( https://github.com/xmake-io/xmake/issues/1452 ),还是有别的办法?
要么等那个特性完成,但目前不保证具体时间点,短期内不一定支持
要么自己 add_ldflags() 外面走 group link 搞下
add_ldflags()实测不行,报错
warning: add_ldflags("-Wl,--start-group -lmkl_intel_lp64 -lmkl_tbb_thread -lmkl_core -Wl,--end-group") is ignored, please pass `{force = true}` or call `set_policy("check.auto_ignore_flags", false)` if you want to set it.
用了package:add("ldflags", "..", {force = true})但不起作用
{force = true} 是给 add_ldflags 的,根据提示操作
{force = true} 是给 add_ldflags 的,根据提示操作
flags需要根据config拼凑,因此没法用add_ldflags代替。不过package:add("ldflags")和add_ldflags行为应该一样才对啊
package:add 都不一定支持 ldflags。。目前应该仅对抽象的 defines/lindkdirs 做了支持
package里面的group link功能能不能优先实现一下?完整的link顺序支持确实太过复杂,但只是group link不是很复杂;现在需要group link的package有一些( https://github.com/xmake-io/xmake/issues/2012 ),尤其是mkl,现在xmake-repo中很多库需要用blas都是暂时切到openblas了,而更稳定效果更好的mkl因为xmake不支持group link而用不了,这个限制挺大的
包里直接走 add_ldflags 呢,也可以加 group
包里直接走 add_ldflags 呢,也可以加 group
这个之前是不行的,上面有讨论,现在这块有修改吗
add_ldflags 刚测了下,原本是完全支持的,只不过默认开了 check flags,检测失败就忽略了。。
warning: add_ldflags("-Wl,--start-group -lmkl_intel_lp64 -lmkl_tbb_thread -lmkl_core -Wl,--end-group") is ignored, please pass
{force = true}or callset_policy("check.auto_ignore_flags", false)if you want to set it.
而你之前那个 ldflags ,因为里面缺少 -L,单独检测,就失败了。。
而 package 里面 {force = true} 暂时不支持,所以只要 ldflags 检测失败,就永远无法加上了。。
我刚 dev 改了下,对 add_ldflags/add_shflags 默认改为 force 模式了,可以完全加上,但是你配置时候,得判断下 gcc/clang 分别处理,mac clang下得用 -Xlinker 。
至于 linkgroup ,我接口还没设计好,要支持,至少要得跟 target 层接口保持一致,还得考虑后期 add_links 的顺序调整啥的,目前有点乱,等确定好了再说。