From: mockturtle on 17 Sep 2009 08:38 Dear all, I have a question that I am afraid is awfully trivial, but I spent half a morning without finding any answer. My setup: I am working with GPS and I have an Ada procedure (say Interface_to_Addr in foo.adb) that needs to call a small C function (char *interface_to_ip (char*)) defined in interface_to_ip.c. So, in my Ada code I wrote function interface_to_ip(interf : chars_ptr) return chars_ptr; pragma Import(C, interface_to_ip); Everything compiles fine, but when it is time to link, the linker complains (correctly) that it cannot find "interface_to_ip". The problem is that the compiler does not know that interface_to_ip is in interface_to_ip.c, or, in other words, it does not know that foo.adb depends on interface_to_ip.c. Currently I solved by adding the line pragma Linker_Options("../../interface_to_ip.o"); and by compiling "by hand" interface_to_ip.c to interface_to_ip.o, but this solution is *UGLY*. Everything would be fine if I could tell to the compiler that foo.adb depends on interface_to_ip.c, but I do not know how to do it. I looked under the GPS "Project" menu, browsed the GNAT user & reference manuals (although not in the deepest detail) and googled for a while, but I could not find an answer. Thank you in advance for your help.
From: Ludovic Brenta on 17 Sep 2009 09:07 mockturtle wrote on comp.lang.ada: > Dear all, > I have a question that I am afraid is awfully trivial, but I spent > half a morning without finding any answer. > > My setup: I am working with GPS and I have an Ada procedure (say > Interface_to_Addr in foo.adb) that needs to call a small C function > (char *interface_to_ip (char*)) defined in interface_to_ip.c. So, in > my Ada code I wrote > > function interface_to_ip(interf : chars_ptr) return chars_ptr; > pragma Import(C, interface_to_ip); > > Everything compiles fine, but when it is time to link, the linker > complains (correctly) that it cannot find "interface_to_ip". The > problem is that the compiler does not know that interface_to_ip is in > interface_to_ip.c, or, in other words, it does not know that foo.adb > depends on interface_to_ip.c. > > Currently I solved by adding the line > > pragma Linker_Options("../../interface_to_ip.o"); > > and by compiling "by hand" interface_to_ip.c to interface_to_ip.o, but > this solution is *UGLY*. > > Everything would be fine if I could tell to the compiler that foo.adb > depends on interface_to_ip.c, but I do not know how to do it. I > looked under the GPS "Project" menu, browsed the GNAT user & reference > manuals (although not in the deepest detail) and googled for a while, > but I could not find an answer. > > Thank you in advance for your help. I normally use a Makefile to compile in such situations but there are two alternatives: gprmake and its successor, gprbuild. In GPS, you can specify that your project is multi-language; this will cause it to call the proper tool (instead of gnatmake, which is for Ada-only projects). I cannot be more specific as I don't use GPS myself. Hopefully the project manager interface in GPS should be intuitive enough. -- Ludovic Brenta.
From: Dmitry A. Kazakov on 17 Sep 2009 09:29 On Thu, 17 Sep 2009 05:38:43 -0700 (PDT), mockturtle wrote: > Dear all, > I have a question that I am afraid is awfully trivial, but I spent > half a morning without finding any answer. > > My setup: I am working with GPS and I have an Ada procedure (say > Interface_to_Addr in foo.adb) that needs to call a small C function > (char *interface_to_ip (char*)) defined in interface_to_ip.c. So, in > my Ada code I wrote > > function interface_to_ip(interf : chars_ptr) return chars_ptr; > pragma Import(C, interface_to_ip); > > Everything compiles fine, but when it is time to link, the linker > complains (correctly) that it cannot find "interface_to_ip". The > problem is that the compiler does not know that interface_to_ip is in > interface_to_ip.c, or, in other words, it does not know that foo.adb > depends on interface_to_ip.c. > > Currently I solved by adding the line > > pragma Linker_Options("../../interface_to_ip.o"); > > and by compiling "by hand" interface_to_ip.c to interface_to_ip.o, but > this solution is *UGLY*. > > Everything would be fine if I could tell to the compiler that foo.adb > depends on interface_to_ip.c, but I do not know how to do it. I > looked under the GPS "Project" menu, browsed the GNAT user & reference > manuals (although not in the deepest detail) and googled for a while, > but I could not find an answer. The project file (*.gpr) has "package Linker". You can put linker options there for example: package Linker is for Default_Switches ("ada") use ("-g", "-lgmem", <...further options...>); end Linker; Alternatively, and probably better solution, would be to include the C source into the project. AFAIK GPS supports C. In that case you should be able to handle interface_to_ip.c exactly as you do Ada files. BTW, never use GPS->Project->Edit Project Properties. Notepad is your friend! (:-)) -- Regards, Dmitry A. Kazakov http://www.dmitry-kazakov.de
From: mockturtle on 17 Sep 2009 09:32 On Sep 17, 3:07 pm, Ludovic Brenta <ludo...(a)ludovic-brenta.org> wrote: > mockturtle wrote on comp.lang.ada: > > > > > > > Dear all, > > I have a question that I am afraid is awfully trivial, but I spent > > half a morning without finding any answer. > > > My setup: I am working with GPS and I have an Ada procedure (say > > Interface_to_Addr in foo.adb) that needs to call a small C function > > (char *interface_to_ip (char*)) defined in interface_to_ip.c. So, in > > my Ada code I wrote > > > function interface_to_ip(interf : chars_ptr) return chars_ptr; > > pragma Import(C, interface_to_ip); > > > Everything compiles fine, but when it is time to link, the linker > > complains (correctly) that it cannot find "interface_to_ip". The > > problem is that the compiler does not know that interface_to_ip is in > > interface_to_ip.c, or, in other words, it does not know that foo.adb > > depends on interface_to_ip.c. > > > Currently I solved by adding the line > > > pragma Linker_Options("../../interface_to_ip.o"); > > > and by compiling "by hand" interface_to_ip.c to interface_to_ip.o, but > > this solution is *UGLY*. > > > Everything would be fine if I could tell to the compiler that foo.adb > > depends on interface_to_ip.c, but I do not know how to do it. I > > looked under the GPS "Project" menu, browsed the GNAT user & reference > > manuals (although not in the deepest detail) and googled for a while, > > but I could not find an answer. > > > Thank you in advance for your help. > > I normally use a Makefile to compile in such situations but there are > two alternatives: gprmake and its successor, gprbuild. In GPS, you can > specify that your project is multi-language; this will cause it to > call the proper tool (instead of gnatmake, which is for Ada-only I did. If I open with an editor the .gpr file created by GPS I find the line for Languages use ("Ada", "C"); > projects). I cannot be more specific as I don't use GPS myself. > Hopefully the project manager interface in GPS should be intuitive > enough. Unfortunately I was not able to find any way to "logically connect" the two files. I must say that I am maybe using an old version (GPS 4.0.2 from Help->About), maybe this is easier in the current version. (For several reasons, I would avoid updating if possible) > > -- > Ludovic Brenta.
From: Ludovic Brenta on 17 Sep 2009 10:49 mockturtle wrote on comp.lang.ada: > On Sep 17, 3:07 pm, Ludovic Brenta <ludo...(a)ludovic-brenta.org> wrote: >> I normally use a Makefile to compile in such situations but there are >> two alternatives: gprmake and its successor, gprbuild. In GPS, you can >> specify that your project is multi-language; this will cause it to >> call the proper tool (instead of gnatmake, which is for Ada-only > > I did. If I open with an editor the .gpr file created by GPS I find > the line > > for Languages use ("Ada", "C"); From memory, this is necessary but not sufficient; you also have to tick a check box somewhere to tell GPS that your project file is multi- language. This is confusing, I know, and I learned the hard way :) -- Ludovic Brenta.
|
Next
|
Last
Pages: 1 2 Prev: GUI Application in ObjectAda Next: Newbie question: How to use gnat make |