【发布时间】:2021-07-22 00:19:05
【问题描述】:
作为一项心理锻炼,我正在尝试编写一个程序,该程序直接链接到我的 Macbook Pro 的 GPU 驱动程序,而不是使用 Apple 的 Metal 框架。一些探索使我找到了这个文件(可能特定于我的特定硬件):
/System/Library/Extensions/AMDRadeonX6000MTLDriver.bundle/Contents/MacOS/AMDRadeonX6000MTLDriver
在其上运行 file 确认这是一个 Mach-O 64 位动态链接共享库。
在它上面运行 nm 告诉我它是 AMD 的 ROCr 运行时的超集。我特别感兴趣的一个符号是这个:
$ nm -gD AMDRadeonX6000MTLDriver | grep "hsa_init"
00000000001cca20 T __ZN3HSA8hsa_initEv
$ nm -gCD AMDRadeonX6000MTLDriver | grep "hsa_init"
00000000001cca20 T HSA::hsa_init()
所以我写了这个简单的程序(rocr_test.cpp):
typedef int hsa_status_t;
namespace HSA {
hsa_status_t hsa_init();
}
int main() {
HSA::hsa_init();
return 0;
}
并像这样编译它:
$ clang++ rocr_test.cpp -c
$ clang++ rocr_test.o /System/Library/Extensions/AMDRadeonX6000MTLDriver.bundle/Contents/MacOS/AMDRadeonX6000MTLDriver
Undefined symbols for architecture x86_64:
"HSA::hsa_init()", referenced from:
_main in rocr_main-95c854.o
ld: symbol(s) not found for architecture x86_64
clang-11: error: linker command failed with exit code 1 (use -v to see invocation)
但是,目标文件上的nm 表明链接器应该寻找同名的符号:
$ nm rocr_test.o
U __ZN3HSA8hsa_initEv
0000000000000000 T _main
当nm 显示共享库中明显存在具有此确切名称的符号时,为什么我会看到此链接器错误?
【问题讨论】:
-
你检查过namemangling是一样的,所以它指的是同一个符号吗?或者它可能不是命名空间的一部分而是类成员?
-
这是一个好主意——看起来符号的名称在共享库中是
__ZN3HSA8hsa_initEv,并且我在命名空间中为函数获得了与在类。 -
请不要在包含问题信息的问题中添加 cmets。编辑问题并在此处添加此信息。
-
您的评论讲述了您在类中定义的函数,但问题是关于在命名空间中定义的函数。当心。我建议在“问题”中添加两个损坏名称的副本。我希望在问题中明确写出名称对您有很好的帮助。
-
rocr_test.o是 Mach-O 还是 ELF 格式?使用-v选项运行链接器步骤是否提供任何提示?
标签: c++ macos linker linker-errors amd-gpu