www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Linking phobos64.lib errors

reply "Szymon Gatner" <noemail gmail.com> writes:
Hi,

I am trying to make simple x64 C++ application that uses D static 
library (trying to do "Interfacing with C++" from "D Cookbook" 
chapter). I am Using Visual Studio 2012 to create main() like 
this:

#include <iostream>

extern "C" int rt_init();
extern "C" void rt_term();
// RAII struct for D runtime initialization and termination
struct DRuntime {
   DRuntime() {
     if(!rt_init()) {
       // you could also use an exception
       fprintf(stderr, "D Initialization failed");
       exit(1);
     }
   }
   ~DRuntime() {
     rt_term();
   }
};

int main()
{
   DRuntime druntime;
}

and then I am just setting linker to link to phobos64.lib but I 
am getting those:

1>phobos64.lib(dmain2_4ec_2f9.obj) : error LNK2019: unresolved 
external symbol _deh_beg referenced in function rt_init
1>phobos64.lib(sections_win64_575_4e2.obj) : error LNK2001: 
unresolved external symbol _deh_beg
1>phobos64.lib(sections_win64_57b_5a5.obj) : error LNK2019: 
unresolved external symbol _minfo_end referenced in function 
_D2rt14sections_win6414getModuleInfosFZAyPS6object10ModuleInfo
1>phobos64.lib(sections_win64_57b_5a5.obj) : error LNK2019: 
unresolved external symbol _minfo_beg referenced in function 
_D2rt14sections_win6414getModuleInfosFZAyPS6object10ModuleInfo
1>phobos64.lib(sections_win64_575_4e2.obj) : error LNK2019: 
unresolved external symbol _deh_end referenced in function 
_D2rt14sections_win6412SectionGroup8ehTablesMxFNdZAyS2rt15deh_win64_posix9FuncTable

What am I doing wrong? Book says that on x64 Windows VC++ can be 
used to create hybrid application.
Sep 03 2014
parent reply Rikki Cattermole <alphaglosined gmail.com> writes:
On 3/09/2014 7:22 p.m., Szymon Gatner wrote:
 Hi,

 I am trying to make simple x64 C++ application that uses D static
 library (trying to do "Interfacing with C++" from "D Cookbook" chapter).
 I am Using Visual Studio 2012 to create main() like this:

 #include <iostream>

 extern "C" int rt_init();
 extern "C" void rt_term();
 // RAII struct for D runtime initialization and termination
 struct DRuntime {
    DRuntime() {
      if(!rt_init()) {
        // you could also use an exception
        fprintf(stderr, "D Initialization failed");
        exit(1);
      }
    }
    ~DRuntime() {
      rt_term();
    }
 };

 int main()
 {
    DRuntime druntime;
 }

 and then I am just setting linker to link to phobos64.lib but I am
 getting those:

 1>phobos64.lib(dmain2_4ec_2f9.obj) : error LNK2019: unresolved external
 symbol _deh_beg referenced in function rt_init
 1>phobos64.lib(sections_win64_575_4e2.obj) : error LNK2001: unresolved
 external symbol _deh_beg
 1>phobos64.lib(sections_win64_57b_5a5.obj) : error LNK2019: unresolved
 external symbol _minfo_end referenced in function
 _D2rt14sections_win6414getModuleInfosFZAyPS6object10ModuleInfo
 1>phobos64.lib(sections_win64_57b_5a5.obj) : error LNK2019: unresolved
 external symbol _minfo_beg referenced in function
 _D2rt14sections_win6414getModuleInfosFZAyPS6object10ModuleInfo
 1>phobos64.lib(sections_win64_575_4e2.obj) : error LNK2019: unresolved
 external symbol _deh_end referenced in function
 _D2rt14sections_win6412SectionGroup8ehTablesMxFNdZAyS2rt15deh_win64_posix9FuncTable


 What am I doing wrong? Book says that on x64 Windows VC++ can be used to
 create hybrid application.
My gut feeling looking at that, is that its not linking against the c runtime. For reference I'm pretty sure _deh_beg is related to exception handling.
Sep 03 2014
parent "Szymon Gatner" <noemail gmail.com> writes:
On Wednesday, 3 September 2014 at 08:47:35 UTC, Rikki Cattermole 
wrote:
 On 3/09/2014 7:22 p.m., Szymon Gatner wrote:
 Hi,

 I am trying to make simple x64 C++ application that uses D 
 static
 library (trying to do "Interfacing with C++" from "D Cookbook" 
 chapter).
 I am Using Visual Studio 2012 to create main() like this:

 #include <iostream>

 extern "C" int rt_init();
 extern "C" void rt_term();
 // RAII struct for D runtime initialization and termination
 struct DRuntime {
   DRuntime() {
     if(!rt_init()) {
       // you could also use an exception
       fprintf(stderr, "D Initialization failed");
       exit(1);
     }
   }
   ~DRuntime() {
     rt_term();
   }
 };

 int main()
 {
   DRuntime druntime;
 }

 and then I am just setting linker to link to phobos64.lib but 
 I am
 getting those:

 1>phobos64.lib(dmain2_4ec_2f9.obj) : error LNK2019: unresolved 
 external
 symbol _deh_beg referenced in function rt_init
 1>phobos64.lib(sections_win64_575_4e2.obj) : error LNK2001: 
 unresolved
 external symbol _deh_beg
 1>phobos64.lib(sections_win64_57b_5a5.obj) : error LNK2019: 
 unresolved
 external symbol _minfo_end referenced in function
 _D2rt14sections_win6414getModuleInfosFZAyPS6object10ModuleInfo
 1>phobos64.lib(sections_win64_57b_5a5.obj) : error LNK2019: 
 unresolved
 external symbol _minfo_beg referenced in function
 _D2rt14sections_win6414getModuleInfosFZAyPS6object10ModuleInfo
 1>phobos64.lib(sections_win64_575_4e2.obj) : error LNK2019: 
 unresolved
 external symbol _deh_end referenced in function
 _D2rt14sections_win6412SectionGroup8ehTablesMxFNdZAyS2rt15deh_win64_posix9FuncTable


 What am I doing wrong? Book says that on x64 Windows VC++ can 
 be used to
 create hybrid application.
My gut feeling looking at that, is that its not linking against the c runtime. For reference I'm pretty sure _deh_beg is related to exception handling.
Hey, for some reason I missed this: http://forum.dlang.org/thread/ji93fh$15ph$1 digitalmars.com The fix is to add main() function to D library. Don't know why it is needed for static lib but it sure helps to resolve link issues.
Sep 03 2014