作为一项心理锻炼,我正在尝试编写一个直接链接到我的 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
当显示共享库中明显存在具有此确切名称的符号时,为什么我会看到此链接器错误?