Gcc 使用gprbuild将对象文件链接到项目
使用Gcc 使用gprbuild将对象文件链接到项目,gcc,ada,nvcc,gprbuild,Gcc,Ada,Nvcc,Gprbuild,使用nvcc我用以下bash脚本从项目中创建了一个对象文件: nvcc-Xcompiler-std=c99-dc-src/interface.cu-src/functions.cu nvcc-dlink接口.o函数.o-o对象/link.o 在我的obj文件夹中,我得到一个link.o文件。我需要使用gprbuild将此文件链接到我的Ada项目。如果我不使用nvcc的单独编译模式,我可以完美地编译AdaCuda项目。但是现在,由于我需要单独的编译模式,我必须找到一种方法将link.o链接到项目
nvcc
我用以下bash脚本从项目中创建了一个对象文件:
nvcc-Xcompiler-std=c99-dc-src/interface.cu-src/functions.cu
nvcc-dlink接口.o函数.o-o对象/link.o
在我的obj
文件夹中,我得到一个link.o
文件。我需要使用gprbuild将此文件链接到我的Ada项目。如果我不使用nvcc的单独编译模式,我可以完美地编译AdaCuda项目。但是现在,由于我需要单独的编译模式,我必须找到一种方法将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
我正在做一个DLL接口,他们提供的接口是通过一个C头文件,我有一个从规范自动生成的包;我正在添加post条件,在包的
private
部分,我将此Linker\u Options
pragma用于指示链接器与DLL接口。-IIUC,你可以用这个来解决你的问题
Package import_example is
Bad_Return : Exception;
SUCCESS : constant := 20007;
NOT_INITIALIZED : constant := 20008;
ERROR : constant := 20009;
INVALID : constant := 20010;
Function Return_Report (Name : String; Value : unsigned ) return String is
(Name & " should not return" & unsigned'Image(Value) & '.') with Inline;
function item_1 return unsigned -- some_c_header.h:249
with Import => True,
Convention => C,
External_Name => "item_1",
Post => item_1'Result in
SUCCESS | NOT_INITIALIZED | ERROR | INVALID
or else raise Bad_Return with
Return_Report("item_1", item_1'Result)
;
function wait return unsigned -- some_c_header.h:250
with Import => True,
Convention => C,
External_Name => "wait",
Post => wait'Result in
SUCCESS | NOT_INITIALIZED | ERROR
or else raise Bad_Return with
Return_Report("wait", wait'Result)
;
Private
Pragma Linker_Options( "-lsmcex" );
End import_example;
不确定gprbuild是否支持添加
.o
文件。使用--lib
编译到.a
文件,然后简单地将该文件链接到gprbuild可以解决问题吗?将-v添加到link args可以显示它使用对象的所做的事情。\u Dir使用“obj”
和“link.o”
这可能会说明为什么它没有将它们放在一起并找到您的文件。实际的链接器命令行可能也很有用。没有使用链接器的前导开关
。我倾向于将link.o
作为Linker'Default\u开关中的第一个条目。根据错误消息,“link.o”似乎正在传递给链接器。问题应该在其他地方,例如,一些丢失的库。所以问题很简单。。。仅仅添加link.o是不够的(它只包含GPU代码)。我还必须链接interface.o和functions.o。按照@flyx的建议,我创建了一个静态库,其中包含了所需的所有.o。它现在起作用了