问题:
使用dtk的docker容器编译代码,主程序链接时报错 “ lld: error: target emulation unknown: -m or at least one .o file required ”
环境:
容器镜像:image.sourcefind.cn:5000/dcu/admin/base/dtk:24.04.2-ubuntu22.04-py3.10
主机:主机没有dcu,也没有安装驱动
项目结构:
main // 可执行程序,没有hip代码
+----> lib1.a // 有hip代码
+----> lib2.a // 有hip代码
+----> lib3.a // 没有hip代码
编译系统使用cmake,但没有用 enable_language(HIP) 特性。而是通过给cmake指定toolchain来指定 CXX 编译器为 hipcc。lib1、lib2 的编译参数有 -fgpu-rdc,main的链接参数也指定了 -fgpu-rdc。
代码在rocm-6.2.3 环境下可以编译通过,且可以在 A 卡上正常执行。
这个链接错误是什么原因?

暂无数据
运行报错的原因是设备代码没有链接到主程序。在文档和社区找了一圈,也没有找到解决方法。最后联系了官方的技术支持,给了以下链接参数,问题得以解决。
-Xoffload-linker --whole-archive解决了。
问题出在了编译时指定了 --offload-arch,链接的时候没有指定 --offload-arch,编译器就用了其缺省值,这个跟编译时指定的不一致导致链接报错。我编译时指定的是 gfx906,链接的时候有 gfx906 gfx908。
在 rocm 环境下成功的原因是,编译时指定的 --offload-arch 就是编译主机上安装的 A 卡的 arch,所以链接的时候缺省找到的应该也是同一个 arch,就没有报错。