【发布时间】:2021-06-25 11:07:37
【问题描述】:
使用nvcc,我使用以下 bash 脚本从我的项目中创建了一个目标文件:
nvcc -Xcompiler -std=c99 -dc src/interface.cu src/functions.cu
nvcc -dlink interface.o functions.o -o obj/link.o
在我的obj 文件夹中,我得到一个link.o 文件。我需要使用 gprbuild 将此文件链接到我的 Ada 项目。如果不使用 nvcc 的单独编译模式,我可以完美地编译出 Ada-Cuda 项目。但是现在,由于我需要单独的编译模式,我必须想办法将link.o 与项目的其余部分联系起来。这是.gpr 文件:
project Test is
for Languages use ("Ada");
for Source_Dirs use ("src");
for Object_Dir use "obj";
for Exec_Dir use ".";
for Main use ("main.adb");
for Create_Missing_Dirs use "True";
package Linker is
for Default_Switches("Ada") use (
"-L/usr/local/cuda/lib64",
"-lcuda",
"-lcudart",
"-lcudadevrt",
"-lstdc++",
"-lm");
for Leading_Switches("Ada") use (
"link.o" -- Doesn't work
);
end Linker;
end Test;
这是我得到的错误
Bind
[gprbind] main.bexch
[Ada] main.ali
Link
[link] main.adb
/usr/local/opt/gnat-19.1-x86_64/bin/../libexec/gcc/x86_64-pc-linux-gnu/7.3.1/ld: main.o: in function `_ada_main':
main.adb:(.text+0x5): undefined reference to `bind_say_hello'
/usr/local/opt/gnat-19.1-x86_64/bin/../libexec/gcc/x86_64-pc-linux-gnu/7.3.1/ld: link.o: in function `__cudaRegisterLinkedBinary_45_tmpxft_0000404a_00000000_11_interface_cpp1_ii_f804fc64':
link.stub:(.text+0x50): undefined reference to `__fatbinwrap_45_tmpxft_0000404a_00000000_11_interface_cpp1_ii_f804fc64'
/usr/local/opt/gnat-19.1-x86_64/bin/../libexec/gcc/x86_64-pc-linux-gnu/7.3.1/ld: link.o: in function `__cudaRegisterLinkedBinary_45_tmpxft_0000404a_00000000_13_functions_cpp1_ii_e57d67fc':
link.stub:(.text+0x96): undefined reference to `__fatbinwrap_45_tmpxft_0000404a_00000000_13_functions_cpp1_ii_e57d67fc'
collect2: error: ld returned 1 exit status
gprbuild: link of main.adb failed
gprbuild: failed command was: /usr/local/opt/gnat-19.1-x86_64/bin/gcc main.o link.o b__main.o -L/usr/local/cuda/lib64 -lcuda -lcudart -lcudadevrt -lstdc++ -lm -L/home/cir_eti/Documents/test/multi_cu_file/obj/ -L/home/cir_eti/Documents/test/multi_cu_file/obj/ -L/usr/local/opt/gnat-19.1-x86_64/lib/gcc/x86_64-pc-linux-gnu/7.3.1/adalib/ -static-libgcc /usr/local/opt/gnat-19.1-x86_64/lib/gcc/x86_64-pc-linux-gnu/7.3.1/adalib/libgnat.a -ldl -Wl,-rpath-link,/usr/local/opt/gnat-19.1-x86_64/lib/gcc/x86_64-pc-linux-gnu/7.3.1//adalib -Wl,-z,origin,-rpath,/usr/local/cuda/lib64:$ORIGIN/obj:/usr/local/opt/gnat-19.1-x86_64/lib/gcc/x86_64-pc-linux-gnu/7.3.1/adalib -o /home/cir_eti/Documents/test/multi_cu_file//main
【问题讨论】:
-
不确定 gprbuild 是否支持添加
.o文件。使用--lib编译到.a文件然后简单地将其与gprbuild 链接可以解决问题吗? -
将 -v 添加到链接 args 可能会显示它对
for Object_Dir use "obj";和"link.o"的作用,这可能会显示为什么它没有将它们放在一起并找到您的文件。实际的链接器命令行可能也很有用。 -
没用过
Linker’Leading_Switches。我倾向于将link.o作为Linker’Default_Switches中的第一个条目。 -
根据错误消息,似乎“link.o”正在传递给链接器。问题应该出在其他地方,例如,缺少一些库。
-
所以问题真的很简单...仅添加 link.o 是不够的(它仅包含 GPU 代码)。我还必须链接 interface.o 和 functions.o。根据@flyx 的建议,我创建了一个包含所有 .o 所需的静态库。它现在就像一个魅力