Thread overview
Using static d libs in C++
Sep 28, 2007
Chrono
Sep 29, 2007
Mike Wey
Sep 29, 2007
Chrono
Sep 29, 2007
BCS
Sep 29, 2007
Frits van Bommel
September 28, 2007
Hello!

I'm new to d. And I'd like to use some d functions in my c++ projects by building them static and linking them.

my platform: dmd and g++ on linux.

####################### BEGIN sub.d: ####################### import std.stdio;

extern (C) int testproc(int somevar)
{
        return (somevar + 1);
}
#######################  END  sub.d: #######################

##################### BEGIN main.cpp : ##################### #include <iostream>

extern "C" int testproc(int somevar);

int main(void)
{
  int myvar = 5;
  printf("myvar: %d\n", testproc(myvar));
  return 0;
}
#####################  END  main.cpp : #####################


Compiling them wihout linking.
./dmd -c sub.d
g++ -c main.cpp

everything works fine, I get main.o and sub.o but then

gcc main.o sub.o -o myprogram -m32 -lstdc++ -Xlinker -L./dmd/bin/../lib -lphobos -lpthread -lm



/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../lib/libphobos.a(deh2.o): In
function `_D4deh213__eh_finddataFPvZPS4deh213DHandlerTable':
internal/deh2.d:(.gnu.linkonce.t_D4deh213__eh_finddataFPvZPS4deh213DHandlerTable+0x9):
undefined reference to `_deh_beg'
internal/deh2.d:(.gnu.linkonce.t_D4deh213__eh_finddataFPvZPS4deh213DHandlerTable+0xe):
undefined reference to `_deh_beg'
internal/deh2.d:(.gnu.linkonce.t_D4deh213__eh_finddataFPvZPS4deh213DHandlerTable+0x14):
undefined reference to `_deh_end'
internal/deh2.d:(.gnu.linkonce.t_D4deh213__eh_finddataFPvZPS4deh213DHandlerTable+0x37):
undefined reference to `_deh_end'
collect2: ld returned 1 exit status
--- errorlevel 1




any ideas?
September 29, 2007
Chrono wrote:
> Hello!
> 
> I'm new to d. And I'd like to use some d functions in my c++ projects by
> building them static and linking them.
> 
> my platform: dmd and g++ on linux.
> 
> ####################### BEGIN sub.d: #######################
> import std.stdio;
> 
> extern (C) int testproc(int somevar)
> {
>         return (somevar + 1);
> }
> #######################  END  sub.d: #######################
> 
> ##################### BEGIN main.cpp : #####################
> #include <iostream>
> 
> extern "C" int testproc(int somevar);
> 
> int main(void)
> {
>   int myvar = 5;
>   printf("myvar: %d\n", testproc(myvar));
>   return 0;
> }
> #####################  END  main.cpp : #####################
> 
> 
> Compiling them wihout linking.
> ./dmd -c sub.d
> g++ -c main.cpp
> 
> everything works fine, I get main.o and sub.o but then
> 
> gcc main.o sub.o -o myprogram -m32 -lstdc++ -Xlinker -L./dmd/bin/../lib
> -lphobos -lpthread -lm
> 
> 
> 
> /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../lib/libphobos.a(deh2.o): In
> function `_D4deh213__eh_finddataFPvZPS4deh213DHandlerTable':
> internal/deh2.d:(.gnu.linkonce.t_D4deh213__eh_finddataFPvZPS4deh213DHandlerTable+0x9):
> undefined reference to `_deh_beg'
> internal/deh2.d:(.gnu.linkonce.t_D4deh213__eh_finddataFPvZPS4deh213DHandlerTable+0xe):
> undefined reference to `_deh_beg'
> internal/deh2.d:(.gnu.linkonce.t_D4deh213__eh_finddataFPvZPS4deh213DHandlerTable+0x14):
> undefined reference to `_deh_end'
> internal/deh2.d:(.gnu.linkonce.t_D4deh213__eh_finddataFPvZPS4deh213DHandlerTable+0x37):
> undefined reference to `_deh_end'
> collect2: ld returned 1 exit status
> --- errorlevel 1
> 
> 
> 
> 
> any ideas?


It looks like gcc is looking for libphobos.a in: /usr/lib/libphobos.a while judging from what you use on the command line: -L./dmd/bin/../lib
it's not located there. try specifying the full path.
September 29, 2007
Hi Mike,

thank you for your help.

now I tried:

gcc main.o sub.o -o myprogram -m32 -lstdc++ -Xlinker -L/root/dmd/lib -lphobos -lpthread -lm

/root/dmd that's the original dmd linux package.

but same error as before:

/root/dmd/lib/libphobos.a(deh2.o): In function `_D4deh213__eh_finddataFPvZPS4deh213DHandlerTable':
internal/deh2.d:(.gnu.linkonce.t_D4deh213__eh_finddataFPvZPS4deh213DHandlerTable+0x9): undefined reference to `_deh_beg'
internal/deh2.d:(.gnu.linkonce.t_D4deh213__eh_finddataFPvZPS4deh213DHandlerTable+0xe): undefined reference to `_deh_beg'
internal/deh2.d:(.gnu.linkonce.t_D4deh213__eh_finddataFPvZPS4deh213DHandlerTable+0x14): undefined reference to `_deh_end'
internal/deh2.d:(.gnu.linkonce.t_D4deh213__eh_finddataFPvZPS4deh213DHandlerTable+0x37): undefined reference to `_deh_end'
collect2: ld returned 1 exit status
September 29, 2007
Chrono wrote:
> Hello!
> 
> I'm new to d. And I'd like to use some d functions in my c++ projects by
> building them static and linking them.
> 
> my platform: dmd and g++ on linux.
[snip]
> Compiling them wihout linking.
> ./dmd -c sub.d
> g++ -c main.cpp
> 
> everything works fine, I get main.o and sub.o but then
> 
> gcc main.o sub.o -o myprogram -m32 -lstdc++ -Xlinker -L./dmd/bin/../lib
> -lphobos -lpthread -lm
> 
> /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../lib/libphobos.a(deh2.o): In
> function `_D4deh213__eh_finddataFPvZPS4deh213DHandlerTable':
> internal/deh2.d:(.gnu.linkonce.t_D4deh213__eh_finddataFPvZPS4deh213DHandlerTable+0x9):
> undefined reference to `_deh_beg'
[snip]
> 
> any ideas?

IIRC those symbols are emitted when DMD sees the main() function. Any chance you could write your main() in D?
September 29, 2007
Reply to Chrono,

> Hi Mike,
> 
> thank you for your help.
> 
> now I tried:
> 
> gcc main.o sub.o -o myprogram -m32 -lstdc++ -Xlinker -L/root/dmd/lib
> -lphobos -lpthread -lm
> 
> /root/dmd that's the original dmd linux package.
> 
[...]

try: wc /root/dmd/lib/libphobos.a
this will fail if the current user cant read the file (as they shouldn't if your not running as root, and if you are running as root, shame on you)

If your not sure where to put stuff, I have an install script that works most of the time here

http://svn.dsource.org/projects/scrapple/trunk/scripts/dmd_update

be warned it will attempt to download dmd.zip from the web, so if that is a problem (either you want a different version or you don't want to burn the bandwidth again) you will want to tweak it. Either way there are a few option at the top you might want to twiddle a bit (it attempt to save off old copies of everything for instance) 

And I just noticed I might be missing a few things, if you try it, please tell me how well it worked.