www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.announce - basic raknet bindings for D

reply clayasaurus <clayasaurus gmail.com> writes:
Bindings here --> http://svn.dsource.org/projects/bindings/trunk/raknet/

http://www.rakkarsoft.com/
"A free networking API that provides reliable UDP and high level 
networking constructs on Windows, Linux, and Unix"

What I did was create a C wrapper for the C++ code, and then created a D 
wrapper for the C wrapper.

Unfortunetly, due to linker issues, I have not been able to get it to 
work under windows. More information here ( 
http://svn.dsource.org/projects/bindings/trunk/raknet/README.txt )

I'm hoping some windows programmer comes along, finds this, and manages 
to get it to work for windows. If somebody does, please email me. I 
think your best bet would be to avoid the linker and try loading the DLL 
at runtime.

I should also mention this is not a full fledged binding, not all 
features of raknet are exposed. It is enough for simple multiplayer 
games however, and it would be very easy to extend this binding. I think 
it is a good starting point, coming with two quality samples (basic chat 
client/serv, intermediate opengl line drawing client/serv).

Goodluck. *x-fingers someone manages a windows port*

~ Clay
Nov 23 2005
next sibling parent reply "Walter Bright" <newshound digitalmars.com> writes:
Did you email raknet and ask them to support DMC? Such things usually can
help a lot.
Nov 24 2005
next sibling parent reply John Reimer <terminal.node gmail.com> writes:
Walter Bright wrote:
 Did you email raknet and ask them to support DMC? Such things usually can
 help a lot.
 
 

It seems that the RakNet developers know about DMC. When you try to compile using DMC, they've included an #error message that pops up with "Digital Mars C++ : I don't know your compiler" They support very few other compilers beyond gcc and Visual C++. In fact, I think those are the only ones. I've tried compiling it with DMC also. Of course doing this led me into the wild goose chase of modifying the RakNet code to work with DMC. It's an absolutely horrible process. I'm not sure if it's DMC's fault or the developer's fault, but there are tons of strange/foreign code techniques that DMC rejects. Now I know why I've stuck with D so long. C++ compilers just don't get along with each other! It's like C++ itself is full of incompatible dialects. Here's one error, among many, that I'm having trouble with (perhaps I should have stuck this in the C++ forum): typename BinarySearchTree<BinarySearchTreeType>::node*& BinarySearchTree<BinarySearchTreeType>::find( const BinarySearchTreeType& element, typename BinarySearchTree<BinarySearchTreeType>::node** parent ) { static typename BinarySearchTree::node * current; current = this->root; *parent = 0; this->direction = this->ROOT; if ( BinarySearchTree_size == 0L ) { this->direction = this->NOT_FOUND; return current = 0; // <--- ERROR!! } // ..... and so one } Error: C:\Projects\c++\RakNet\Include\BinarySearchTree.h(598): reference must refer to same type or be const What do I do here? I must not know enough C++ to fix this error. I can't seem to cast the 0 to the BinarySearchTre::node* (at least that didn't work). And the return type is a reference to a pointer... ewwww!!! What a hodgepodge of ickiness! Is the above supposed to be software development at its finest? Is that supposed to beautiful template code? :( (sorry, just ranting). Is it really worth trying to get the C++ projects out there to work on so many compilers that can't agree with each other on what's legal C++? It's high time for D to take over the world, Walter! Please! Oh... DMC version 8.45 here. -JJR
Nov 24 2005
next sibling parent reply clayasaurus <clayasaurus gmail.com> writes:
John Reimer wrote:
 Walter Bright wrote:
 
 Did you email raknet and ask them to support DMC? Such things usually can
 help a lot.

It seems that the RakNet developers know about DMC. When you try to compile using DMC, they've included an #error message that pops up with "Digital Mars C++ : I don't know your compiler" They support very few other compilers beyond gcc and Visual C++. In fact, I think those are the only ones. I've tried compiling it with DMC also. Of course doing this led me into the wild goose chase of modifying the RakNet code to work with DMC. It's an absolutely horrible process. I'm not sure if it's DMC's fault or the developer's fault, but there are tons of strange/foreign code techniques that DMC rejects. Now I know why I've stuck with D so long. C++ compilers just don't get along with each other! It's like C++ itself is full of incompatible dialects. Here's one error, among many, that I'm having trouble with (perhaps I should have stuck this in the C++ forum): typename BinarySearchTree<BinarySearchTreeType>::node*& BinarySearchTree<BinarySearchTreeType>::find( const BinarySearchTreeType& element, typename BinarySearchTree<BinarySearchTreeType>::node** parent ) { static typename BinarySearchTree::node * current; current = this->root; *parent = 0; this->direction = this->ROOT; if ( BinarySearchTree_size == 0L ) { this->direction = this->NOT_FOUND; return current = 0; // <--- ERROR!! } // ..... and so one } Error: C:\Projects\c++\RakNet\Include\BinarySearchTree.h(598): reference must refer to same type or be const What do I do here? I must not know enough C++ to fix this error. I can't seem to cast the 0 to the BinarySearchTre::node* (at least that didn't work). And the return type is a reference to a pointer... ewwww!!! What a hodgepodge of ickiness! Is the above supposed to be software development at its finest? Is that supposed to beautiful template code? :( (sorry, just ranting). Is it really worth trying to get the C++ projects out there to work on so many compilers that can't agree with each other on what's legal C++? It's high time for D to take over the world, Walter! Please! Oh... DMC version 8.45 here. -JJR

I actually got a little bit farther than that compiling Raknet myself. For this error, you just have to do current = 0; return current; // or return 0; or return NULL; However, I came up against an even worse error saying it can't find the definition of one of the template members (find_node() or something) even though the function was defined in the right template. *sigh* I've also tried just converting the whole thing to D, got fairly far, but in the end decided it probably wasn't worth it as I was coming up with more code I didn't know how to convert properly. You can see how far I got here ( http://svn.dsource.org/projects/warbots/trunk/RaknetPort/ ). Maybe I'll try again in the future, but I've wasted countless hours trying to get it to work on windows already. ~ Clay
Nov 24 2005
next sibling parent reply John Reimer <terminal.node gmail.com> writes:
clayasaurus wrote:
 John Reimer wrote:
 
 Walter Bright wrote:

 Did you email raknet and ask them to support DMC? Such things usually 
 can
 help a lot.

It seems that the RakNet developers know about DMC. When you try to compile using DMC, they've included an #error message that pops up with "Digital Mars C++ : I don't know your compiler" They support very few other compilers beyond gcc and Visual C++. In fact, I think those are the only ones. I've tried compiling it with DMC also. Of course doing this led me into the wild goose chase of modifying the RakNet code to work with DMC. It's an absolutely horrible process. I'm not sure if it's DMC's fault or the developer's fault, but there are tons of strange/foreign code techniques that DMC rejects. Now I know why I've stuck with D so long. C++ compilers just don't get along with each other! It's like C++ itself is full of incompatible dialects. Here's one error, among many, that I'm having trouble with (perhaps I should have stuck this in the C++ forum): typename BinarySearchTree<BinarySearchTreeType>::node*& BinarySearchTree<BinarySearchTreeType>::find( const BinarySearchTreeType& element, typename BinarySearchTree<BinarySearchTreeType>::node** parent ) { static typename BinarySearchTree::node * current; current = this->root; *parent = 0; this->direction = this->ROOT; if ( BinarySearchTree_size == 0L ) { this->direction = this->NOT_FOUND; return current = 0; // <--- ERROR!! } // ..... and so one } Error: C:\Projects\c++\RakNet\Include\BinarySearchTree.h(598): reference must refer to same type or be const What do I do here? I must not know enough C++ to fix this error. I can't seem to cast the 0 to the BinarySearchTre::node* (at least that didn't work). And the return type is a reference to a pointer... ewwww!!! What a hodgepodge of ickiness! Is the above supposed to be software development at its finest? Is that supposed to beautiful template code? :( (sorry, just ranting). Is it really worth trying to get the C++ projects out there to work on so many compilers that can't agree with each other on what's legal C++? It's high time for D to take over the world, Walter! Please! Oh... DMC version 8.45 here. -JJR

I actually got a little bit farther than that compiling Raknet myself. For this error, you just have to do current = 0; return current; // or return 0; or return NULL;

Pffff. How stupid of me. I should have thought of trying that. Thanks. I did try using NULL, but it wouldn't recognize it.
 However, I came up against an even worse error saying it can't find the 
 definition of one of the template members (find_node() or something) 
 even though the function was defined in the right template. *sigh*

Really? I came across several similar problems that I was able to fix earlier. I'll see if I come across that one, too. There was quite a few things that needed to be changed, that's for sure.
 I've also tried just converting the whole thing to D, got fairly far, 
 but in the end decided it probably wasn't worth it as I was coming up 
 with more code I didn't know how to convert properly. You can see how 
 far I got here ( 
 http://svn.dsource.org/projects/warbots/trunk/RaknetPort/ ).

To tell you the truth, Raknet is one library that would look VERY good in D. I can't stand seeing all that ugly C++ code. I know others have told you it's not worth it to port it to D, but I'm thinking that it's one library that would suite D very well natively.
 Maybe I'll try again in the future, but I've wasted countless hours 
 trying to get it to work on windows already.
 
 ~ Clay
 

I know the feeling. Just curious... You did know you got a response at the dsource.org forums, right? Mike84 had already succeeded in getting his version of RakNet interfaced with D on windows. He must have done it a couple months ago. -JJR
Nov 24 2005
parent "Walter Bright" <newshound digitalmars.com> writes:
"John Reimer" <terminal.node gmail.com> wrote in message
news:dm5j5j$1mba$1 digitaldaemon.com...
 To tell you the truth, Raknet is one library that would look VERY good
 in D.  I can't stand seeing all that ugly C++ code.  I know others have
 told you it's not worth it to port it to D, but I'm thinking that it's
 one library that would suite D very well natively.

I wouldn't be surprised if it turned out to be easier to recode in D than to try to produce a C interface for it. One of the problems with hooking up D to a C++ library is it still tends to drag along C++ problems - things like memory management, bloat, not handling UTF code, etc.
Nov 24 2005
prev sibling parent John Reimer <terminal.node gmail.com> writes:
clayasaurus wrote:

 
 I actually got a little bit farther than that compiling Raknet myself. 
 For this error, you just have to do
 
 current = 0;
 return current; // or return 0; or return NULL;
 
 However, I came up against an even worse error saying it can't find the 
 definition of one of the template members (find_node() or something) 
 even though the function was defined in the right template. *sigh*
 

I tried again, got a little further, and finally gave up. It was just too insanely complicated to figure out what was intended or what dmc didn't like about certain sections of those convoluted templates. I see you've converted a sizeable portion of RakNet into D. That's no easy task. Trying to read and interpret that C++ would be challenging to say the least. I'll look into it. If I can add to it, I'll do what I can. Thanks for all the hard work you've done so far. Despite it's being in C++, Raknet does look like a very solid library. -JJR
Nov 24 2005
prev sibling next sibling parent "Charles" <noone nowhere.com> writes:
  It's like C++
 itself is full of incompatible dialects.

Lol , so true.
 Error: C:\Projects\c++\RakNet\Include\BinarySearchTree.h(598): reference
 must refer to same type or be const

Good lord thats complicated looking code :S.
   It's high time for D to take over the world, Walter! Please!

Here here! "John Reimer" <terminal.node gmail.com> wrote in message news:dm59ii$1739$1 digitaldaemon.com...
 Walter Bright wrote:
 Did you email raknet and ask them to support DMC? Such things usually


 help a lot.

It seems that the RakNet developers know about DMC. When you try to compile using DMC, they've included an #error message that pops up with "Digital Mars C++ : I don't know your compiler" They support very few other compilers beyond gcc and Visual C++. In fact, I think those are the only ones. I've tried compiling it with DMC also. Of course doing this led me into the wild goose chase of modifying the RakNet code to work with DMC. It's an absolutely horrible process. I'm not sure if it's DMC's fault or the developer's fault, but there are tons of strange/foreign code techniques that DMC rejects. Now I know why I've stuck with D so long. C++ compilers just don't get along with each other! It's like C++ itself is full of incompatible dialects. Here's one error, among many, that I'm having trouble with (perhaps I should have stuck this in the C++ forum): typename BinarySearchTree<BinarySearchTreeType>::node*& BinarySearchTree<BinarySearchTreeType>::find( const BinarySearchTreeType& element, typename BinarySearchTree<BinarySearchTreeType>::node** parent ) { static typename BinarySearchTree::node * current; current = this->root; *parent = 0; this->direction = this->ROOT; if ( BinarySearchTree_size == 0L ) { this->direction = this->NOT_FOUND; return current = 0; // <--- ERROR!! } // ..... and so one } Error: C:\Projects\c++\RakNet\Include\BinarySearchTree.h(598): reference must refer to same type or be const What do I do here? I must not know enough C++ to fix this error. I can't seem to cast the 0 to the BinarySearchTre::node* (at least that didn't work). And the return type is a reference to a pointer... ewwww!!! What a hodgepodge of ickiness! Is the above supposed to be software development at its finest? Is that supposed to beautiful template code? :( (sorry, just ranting). Is it really worth trying to get the C++ projects out there to work on so many compilers that can't agree with each other on what's legal C++? It's high time for D to take over the world, Walter! Please! Oh... DMC version 8.45 here. -JJR

Nov 24 2005
prev sibling parent reply "Walter Bright" <newshound digitalmars.com> writes:
"John Reimer" <terminal.node gmail.com> wrote in message
news:dm59ii$1739$1 digitaldaemon.com...
 Walter Bright wrote:
 Did you email raknet and ask them to support DMC? Such things usually


 help a lot.

compile using DMC, they've included an #error message that pops up with "Digital Mars C++ : I don't know your compiler"

Them knowing DMC++ exists isn't enough. They need to know that there are users who want raknet to support DMC++. The way to do that is to tell them - the more emails they get from different people, the more convincing it is. Telling me doesn't help at all <g>.
Nov 24 2005
parent reply John Reimer <terminal.node gmail.com> writes:
Walter Bright wrote:
 "John Reimer" <terminal.node gmail.com> wrote in message
 news:dm59ii$1739$1 digitaldaemon.com...
 
Walter Bright wrote:

Did you email raknet and ask them to support DMC? Such things usually


can
help a lot.

It seems that the RakNet developers know about DMC. When you try to compile using DMC, they've included an #error message that pops up with "Digital Mars C++ : I don't know your compiler"

Them knowing DMC++ exists isn't enough. They need to know that there are users who want raknet to support DMC++. The way to do that is to tell them - the more emails they get from different people, the more convincing it is. Telling me doesn't help at all <g>.

Well we're in trouble then. I bet the RakNet developer got a grand total of 2 emails. One from Clay, one from me. Quite frankly, it appears the raknet code is so compiler specific as to make the port to a new compiler a major headache, even for the RakNet developer himself. Since he provides his library free, his response is more likely to be "do it yourself." That won't do, of course, for the moment. After seeing all the subtle C++ conflicts amongst the compilers, I have one rueful comment: C++, as we know it, is a farce, a fake, a false hope; it's a language full of ambiguities, one only a lawyer could love. C++ is only useful if you stick to one compiler vender's dialect, and learn it well. What a joke! (forgive me... obviously I'm still in the blowing-off-steam mode; I just can't believe C++ has captured the hearts and minds of so many: it's very much like the emperor's new clothes). As it turns out, the DLL version of RakNet, with a C wrapping, is the best option for interfacing with D, at the moment (dsource.org apparently already had such a wrapping). Recoding in D would be a clean solution, though a hefty one and bug prone for the first long while. We'll see what comes of this. -JJR
Nov 24 2005
parent "Walter Bright" <newshound digitalmars.com> writes:
"John Reimer" <terminal.node gmail.com> wrote in message
news:dm6509$2dui$1 digitaldaemon.com...
 Well we're in trouble then.  I bet the RakNet developer got a grand
 total of 2 emails.  One from Clay, one from me.

I know it may seem futile from your end, but those emails do make a difference.
 Quite frankly, it
 appears the raknet code is so compiler specific as to make the port to a
 new compiler a major headache, even for the RakNet developer himself.
 Since he provides his library free, his response is more likely to be
 "do it yourself."  That won't do, of course, for the moment.

I don't think it would be that bad for someone who is intimately familiar with the raknet code and what it is trying to do. It would be pretty hard for anyone else, though.
 After seeing all the subtle C++ conflicts amongst the compilers, I have
 one rueful comment:  C++, as we know it, is a farce, a fake, a false
 hope; it's a language full of ambiguities, one only a lawyer could love.
   C++ is only useful if you stick to one compiler vender's dialect, and
 learn it well.

What often happens is professionals stick to a subset of C++ that tends to work across compilers. Then there are also those who simply must rely on the behavior of every corner case; they tend to spend a lot of time struggling with diverse compilers. As anyone can see with the DMD front end code, I am in the former camp <g>.
 What a joke! (forgive me... obviously I'm still in the
 blowing-off-steam mode; I just can't believe C++ has captured the hearts
 and minds of so many: it's very much like the emperor's new clothes).

There was nothing else comparable in power in the late 80's and early 90's, not even close.
 As it turns out, the DLL version of RakNet, with a C wrapping, is the
 best option for interfacing with D, at the moment (dsource.org
 apparently already had such a wrapping).  Recoding in D would be a clean
 solution, though a hefty one and bug prone for the first long while.
 We'll see what comes of this.

I'd still like to see it in D <g>.
Nov 24 2005
prev sibling parent reply clayasaurus <clayasaurus gmail.com> writes:
Walter Bright wrote:
 Did you email raknet and ask them to support DMC? Such things usually can
 help a lot.
 
 

I sent a feature request in their forum to support DMC.
Nov 24 2005
parent reply John Reimer <terminal.node gmail.com> writes:
clayasaurus wrote:
 Walter Bright wrote:
 
 Did you email raknet and ask them to support DMC? Such things usually can
 help a lot.

I sent a feature request in their forum to support DMC.

And I sent one directly to the author.
Nov 24 2005
parent John Reimer <terminal.node gmail.com> writes:
John Reimer wrote:
 clayasaurus wrote:
 
 Walter Bright wrote:

 Did you email raknet and ask them to support DMC? Such things usually 
 can
 help a lot.

I sent a feature request in their forum to support DMC.

And I sent one directly to the author.

A nice one, mind you. I didn't sound cranky like I did here. ;)
Nov 24 2005
prev sibling parent reply clayasaurus <clayasaurus gmail.com> writes:
I finally applied numerous hacks to get raknet to build under the DMC 
compiler, but there are still serious linking issues...

Here is a 'sample' of what i'm getting in case anyone else knows what is 
going on...

I also am going to check out mike's port now...

C:\CINTER~1>CFPATH="-CFPATH/etc/"

C:\CINTER~1>make -f Makefile.win
copy *.obj objs
chat.obj
rakbitstreamglue.obj
rakclientglue.obj
rakserverglue.obj
         4 file(s) copied.

C:\CINTER~1>build chat.d -g -Rn -full objs\*.obj C:\dmd\lib\WS2_32.lib 
C:\dmd\lib\phobos.lib C:\dm\lib\WSOCK32.lib C:\dm\lib\UUID.lib snn.lib 
C:\dm\lib\OLEAUT32.lib C:\dm\lib\KERNEL32.lib C:\dm\lib\CTL3D32.lib 
C:\dm\lib\ADVAPI32.lib C:\dm\lib\comctl32.lib C:\dm\lib\ODBC32.lib 
C:\dm\lib\RPCRt4.lib C:\dm\lib\stlp45dm_static.lib C:\dm\lib\WINMM.lib 
C:\dm\lib\COMDLG32.lib C:\dm\lib\OLE32.lib C:\dm\lib\SHELL32.lib 
C:\dm\lib\USER32.lib C:\dm\lib\WINSPOOL.lib
C:\dmd\bin\..\..\dm\bin\link.exe 
objs\*+chat+raknet\server+raknet\raknet+raknet\client+raknet\packetenumerations+raknet\packetpriority+raknet\networktypes,chat.exe,,C:\dm\lib\OLEAUT32.lib+C:\dm\lib\KERNEL32.lib+C:\dm\lib\ADVAPI32.lib+C:\dm\lib\comctl32.lib+C:\dm\lib\ODBC32.lib+C:\dm\lib\RPCRt4.lib+snn.lib+C:\dm\lib\COMDLG32.lib+C:\dm\lib\WSOCK32.lib+C:\dmd\lib\WS2_32.lib+C:\dmd\lib\phobos.lib+C:\dm\lib\OLE32.lib+C:\dm\lib\stlp45dm_static.lib+C:\dm\lib\CTL3D32.lib+C:\dm\lib\USER32.lib+C:\dm\lib\WINMM.lib+C:\dm\lib\WINSPOOL.lib+C:\dm\lib\UUID.lib+C:\dm\lib\SHELL32.lib+user32+kernel32,chat.def/co/noi;

OPTLINK (R) for Win32  Release 7.50B1
Copyright (C) Digital Mars 1989 - 2001  All Rights Reserved

objs\DistributedNetworkObjectManager.obj(DistributedNetworkObjectManager) 
  Offset 000D3H Record Type 0091
  Error 1: Previous Definition Different : 
?UNASSIGNED_PLAYER_ID  3UPlayerID  B (const PlayerID UNASSIGNED_PLAYER_ID)
objs\DistributedNetworkObjectStub.obj(DistributedNetworkObjectStub) 
Offset 000D0H Record Type 0091
  Error 1: Previous Definition Different : 
?UNASSIGNED_PLAYER_ID  3UPlayerID  B (const PlayerID UNASSIGNED_PLAYER_ID)
objs\FullyConnectedMesh.obj(FullyConnectedMesh)  Offset 00117H Record 
Type 0091
  Error 1: Previous Definition Different : 
?UNASSIGNED_PLAYER_ID  3UPlayerID  B (const PlayerID UNASSIGNED_PLAYER_ID)
objs\MessageHandlerInterface.obj(MessageHandlerInterface)  Offset 000F6H 
Record Type 0091
  Error 1: Previous Definition Different : 
?UNASSIGNED_PLAYER_ID  3UPlayerID  B (const PlayerID UNASSIGNED_PLAYER_ID)
objs\NetworkObject.obj(NetworkObject)  Offset 000C1H Record Type 0091
  Error 1: Previous Definition Different : 
?UNASSIGNED_PLAYER_ID  3UPlayerID  B (const PlayerID UNASSIGNED_PLAYER_ID)
objs\NetworkTypes.obj(NetworkTypes)  Offset 000C0H Record Type 0091
  Error 1: Previous Definition Different : 
?UNASSIGNED_PLAYER_ID  3UPlayerID  B (const PlayerID UNASSIGNED_PLAYER_ID)
objs\PacketPool.obj(PacketPool)  Offset 000BEH Record Type 0091
  Error 1: Previous Definition Different : 
?UNASSIGNED_PLAYER_ID  3UPlayerID  B (const PlayerID UNASSIGNED_PLAYER_ID)
objs\rakbitstreamglue.obj(rakbitstreamglue)  Offset 000D8H Record Type 0091
  Error 1: Previous Definition Different : 
?UNASSIGNED_PLAYER_ID  3UPlayerID  B (const PlayerID UNASSIGNED_PLAYER_ID)
objs\RakClient.obj(RakClient)  Offset 000BDH Record Type 0091
  Error 1: Previous Definition Different : 
?UNASSIGNED_PLAYER_ID  3UPlayerID  B (const PlayerID UNASSIGNED_PLAYER_ID)
objs\RakClient.obj(RakClient)  Offset 000DEH Record Type 0091
  Error 1: Previous Definition Different : ?swapBE cat  YAXAAI Z (void 
cdecl cat::swapBE(unsigned &))
objs\RakClient.obj(RakClient)  Offset 000F9H Record Type 0091
  Error 1: Previous Definition Different : ?swapBE cat  YAXAAG Z (void 
cdecl cat::swapBE(unsigned short &))
objs\RakClient.obj(RakClient)  Offset 00111H Record Type 0091
  Error 1: Previous Definition Different : ?getBE cat  YAII Z (unsigned 
cdecl cat::getBE(unsigned ))
objs\RakClient.obj(RakClient)  Offset 00129H Record Type 0091
  Error 1: Previous Definition Different : ?getBE cat  YAGG Z (unsigned 
short cdecl cat::getBE(unsigned short ))
objs\RakClient.obj(RakClient)  Offset 0014AH Record Type 0091
  Error 1: Previous Definition Different : ?swapBE cat  YAXAAH Z (void 
cdecl cat::swapBE(int &))
objs\RakClient.obj(RakClient)  Offset 00165H Record Type 0091
  Error 1: Previous Definition Different : ?swapBE cat  YAXAAF Z (void 
cdecl cat::swapBE(short &))
objs\RakClient.obj(RakClient)  Offset 0017DH Record Type 0091
  Error 1: Previous Definition Different : ?getBE cat  YAHH Z (int cdecl 
cat::getBE(int ))
objs\RakClient.obj(RakClient)  Offset 00195H Record Type 0091
  Error 1: Previous Definition Different : ?getBE cat  YAFF Z (short 
cdecl cat::getBE(short ))
objs\RakClient.obj(RakClient)  Offset 00333H Record Type 0091
  Error 1: Previous Definition Different : 
?next_highest_power_of_2  YAII Z (unsigned cdecl 
next_highest_power_of_2(unsigned ))
objs\rakclientglue.obj(rakclientglue)  Offset 000DDH Record Type 0091
  Error 1: Previous Definition Different : 
?UNASSIGNED_PLAYER_ID  3UPlayerID  B (const PlayerID UNASSIGNED_PLAYER_ID)
objs\RakNetworkFactory.obj(RakNetworkFactory)  Offset 000C5H Record Type 
0091
  Error 1: Previous Definition Different : 
?UNASSIGNED_PLAYER_ID  3UPlayerID  B (const PlayerID UNASSIGNED_PLAYER_ID)
objs\RakNetworkFactory.obj(RakNetworkFactory)  Offset 000E6H Record Type 
0091
  Error 1: Previous Definition Different : ?swapBE cat  YAXAAI Z (void 
cdecl cat::swapBE(unsigned &))
objs\RakNetworkFactory.obj(RakNetworkFactory)  Offset 00101H Record Type 
0091
  Error 1: Previous Definition Different : ?swapBE cat  YAXAAG Z (void 
cdecl cat::swapBE(unsigned short &))
objs\RakNetworkFactory.obj(RakNetworkFactory)  Offset 00119H Record Type 
0091
  Error 1: Previous Definition Different : ?getBE cat  YAII Z (unsigned 
cdecl cat::getBE(unsigned ))
objs\RakNetworkFactory.obj(RakNetworkFactory)  Offset 00131H Record Type 
0091
  Error 1: Previous Definition Different : ?getBE cat  YAGG Z (unsigned 
short cdecl cat::getBE(unsigned short ))
objs\RakNetworkFactory.obj(RakNetworkFactory)  Offset 00152H Record Type 
0091
  Error 1: Previous Definition Different : ?swapBE cat  YAXAAH Z (void 
cdecl cat::swapBE(int &))
objs\RakNetworkFactory.obj(RakNetworkFactory)  Offset 0016DH Record Type 
0091
  Error 1: Previous Definition Different : ?swapBE cat  YAXAAF Z (void 
cdecl cat::swapBE(short &))
objs\RakNetworkFactory.obj(RakNetworkFactory)  Offset 00185H Record Type 
0091
  Error 1: Previous Definition Different : ?getBE cat  YAHH Z (int cdecl 
cat::getBE(int ))
objs\RakNetworkFactory.obj(RakNetworkFactory)  Offset 0019DH Record Type 
0091
  Error 1: Previous Definition Different : ?getBE cat  YAFF Z (short 
cdecl cat::getBE(short ))
objs\RakNetworkFactory.obj(RakNetworkFactory)  Offset 001C9H Record Type 
0091
  Error 1: Previous Definition Different : 
?next_highest_power_of_2  YAII Z (unsigned cdecl 
next_highest_power_of_2(unsigned ))
objs\RakPeer.obj(RakPeer)  Offset 000BBH Record Type 0091
  Error 1: Previous Definition Different : 
?UNASSIGNED_PLAYER_ID  3UPlayerID  B (const PlayerID UNASSIGNED_PLAYER_ID)
objs\RakPeer.obj(RakPeer)  Offset 000DCH Record Type 0091

clayasaurus wrote:
 Bindings here --> http://svn.dsource.org/projects/bindings/trunk/raknet/
 
 http://www.rakkarsoft.com/
 "A free networking API that provides reliable UDP and high level 
 networking constructs on Windows, Linux, and Unix"
 
 What I did was create a C wrapper for the C++ code, and then created a D 
 wrapper for the C wrapper.
 
 Unfortunetly, due to linker issues, I have not been able to get it to 
 work under windows. More information here ( 
 http://svn.dsource.org/projects/bindings/trunk/raknet/README.txt )
 
 I'm hoping some windows programmer comes along, finds this, and manages 
 to get it to work for windows. If somebody does, please email me. I 
 think your best bet would be to avoid the linker and try loading the DLL 
 at runtime.
 
 I should also mention this is not a full fledged binding, not all 
 features of raknet are exposed. It is enough for simple multiplayer 
 games however, and it would be very easy to extend this binding. I think 
 it is a good starting point, coming with two quality samples (basic chat 
 client/serv, intermediate opengl line drawing client/serv).
 
 Goodluck. *x-fingers someone manages a windows port*
 
 ~ Clay

Nov 24 2005
next sibling parent John Reimer <terminal.node gmail.com> writes:
clayasaurus wrote:
 I finally applied numerous hacks to get raknet to build under the DMC 
 compiler, but there are still serious linking issues...
 

All I can say is a heartfelt "Wow." I had given up. You didn't. What I was afraid of was that my hacks were inserting dangerous fixes into the code.
 Here is a 'sample' of what i'm getting in case anyone else knows what is 
 going on...
 
 I also am going to check out mike's port now...
 
 C:\CINTER~1>CFPATH="-CFPATH/etc/"
 
 C:\CINTER~1>make -f Makefile.win
 copy *.obj objs
 chat.obj
 rakbitstreamglue.obj
 rakclientglue.obj
 rakserverglue.obj
         4 file(s) copied.
 
 C:\CINTER~1>build chat.d -g -Rn -full objs\*.obj C:\dmd\lib\WS2_32.lib 
 C:\dmd\lib\phobos.lib C:\dm\lib\WSOCK32.lib C:\dm\lib\UUID.lib snn.lib 
 C:\dm\lib\OLEAUT32.lib C:\dm\lib\KERNEL32.lib C:\dm\lib\CTL3D32.lib 
 C:\dm\lib\ADVAPI32.lib C:\dm\lib\comctl32.lib C:\dm\lib\ODBC32.lib 
 C:\dm\lib\RPCRt4.lib C:\dm\lib\stlp45dm_static.lib C:\dm\lib\WINMM.lib 
 C:\dm\lib\COMDLG32.lib C:\dm\lib\OLE32.lib C:\dm\lib\SHELL32.lib 
 C:\dm\lib\USER32.lib C:\dm\lib\WINSPOOL.lib
 C:\dmd\bin\..\..\dm\bin\link.exe 
 objs\*+chat+raknet\server+raknet\raknet+raknet\client+raknet\packetenumerations+raknet\packetpriority+raknet\networktypes,chat.exe,,C:\dm\lib\OLEAUT32.lib+C:\dm\lib\KERNEL32.lib+C:\dm\lib\ADVAPI32.lib+C:\dm\lib\comctl32.lib+C:\dm\lib\ODBC32.lib+C:\dm\lib\RPCRt4.lib+snn.lib+C:\dm\lib\COMDLG32.lib+C:\dm\lib\WSOCK32.lib+C:\dmd\lib\WS2_32.lib+C:\dmd\lib\phobos.lib+C:\dm\lib\OLE32.lib+C:\dm\lib\stlp45dm_static.lib+C:\dm\lib\CTL3D32.lib+C:\dm\lib\USER32.lib+C:\dm\lib\WINMM.lib+C:\dm\lib\WINSPOOL.lib+C:\dm\lib\UUID.lib+C:\dm\lib\SHELL32.lib+user32+kerne
32,chat.def/co/noi; 
 
 
 OPTLINK (R) for Win32  Release 7.50B1
 Copyright (C) Digital Mars 1989 - 2001  All Rights Reserved
 
 objs\DistributedNetworkObjectManager.obj(DistributedNetworkObjectManager) 
  Offset 000D3H Record Type 0091
  Error 1: Previous Definition Different : 
 ?UNASSIGNED_PLAYER_ID  3UPlayerID  B (const PlayerID UNASSIGNED_PLAYER_ID)
 objs\DistributedNetworkObjectStub.obj(DistributedNetworkObjectStub) 
 Offset 000D0H Record Type 0091
  Error 1: Previous Definition Different : 
 ?UNASSIGNED_PLAYER_ID  3UPlayerID  B (const PlayerID UNASSIGNED_PLAYER_ID)
 objs\FullyConnectedMesh.obj(FullyConnectedMesh)  Offset 00117H Record 
 Type 0091
  Error 1: Previous Definition Different : 
 ?UNASSIGNED_PLAYER_ID  3UPlayerID  B (const PlayerID UNASSIGNED_PLAYER_ID)
 objs\MessageHandlerInterface.obj(MessageHandlerInterface)  Offset 000F6H 
 Record Type 0091
  Error 1: Previous Definition Different : 
 ?UNASSIGNED_PLAYER_ID  3UPlayerID  B (const PlayerID UNASSIGNED_PLAYER_ID)
 objs\NetworkObject.obj(NetworkObject)  Offset 000C1H Record Type 0091
  Error 1: Previous Definition Different : 
 ?UNASSIGNED_PLAYER_ID  3UPlayerID  B (const PlayerID UNASSIGNED_PLAYER_ID)
 objs\NetworkTypes.obj(NetworkTypes)  Offset 000C0H Record Type 0091
  Error 1: Previous Definition Different : 
 ?UNASSIGNED_PLAYER_ID  3UPlayerID  B (const PlayerID UNASSIGNED_PLAYER_ID)
 objs\PacketPool.obj(PacketPool)  Offset 000BEH Record Type 0091
  Error 1: Previous Definition Different : 
 ?UNASSIGNED_PLAYER_ID  3UPlayerID  B (const PlayerID UNASSIGNED_PLAYER_ID)
 objs\rakbitstreamglue.obj(rakbitstreamglue)  Offset 000D8H Record Type 0091
  Error 1: Previous Definition Different : 
 ?UNASSIGNED_PLAYER_ID  3UPlayerID  B (const PlayerID UNASSIGNED_PLAYER_ID)
 objs\RakClient.obj(RakClient)  Offset 000BDH Record Type 0091
  Error 1: Previous Definition Different : 
 ?UNASSIGNED_PLAYER_ID  3UPlayerID  B (const PlayerID UNASSIGNED_PLAYER_ID)
 objs\RakClient.obj(RakClient)  Offset 000DEH Record Type 0091
  Error 1: Previous Definition Different : ?swapBE cat  YAXAAI Z (void 
 cdecl cat::swapBE(unsigned &))
 objs\RakClient.obj(RakClient)  Offset 000F9H Record Type 0091
  Error 1: Previous Definition Different : ?swapBE cat  YAXAAG Z (void 
 cdecl cat::swapBE(unsigned short &))
 objs\RakClient.obj(RakClient)  Offset 00111H Record Type 0091
  Error 1: Previous Definition Different : ?getBE cat  YAII Z (unsigned 
 cdecl cat::getBE(unsigned ))
 objs\RakClient.obj(RakClient)  Offset 00129H Record Type 0091
  Error 1: Previous Definition Different : ?getBE cat  YAGG Z (unsigned 
 short cdecl cat::getBE(unsigned short ))
 objs\RakClient.obj(RakClient)  Offset 0014AH Record Type 0091
  Error 1: Previous Definition Different : ?swapBE cat  YAXAAH Z (void 
 cdecl cat::swapBE(int &))
 objs\RakClient.obj(RakClient)  Offset 00165H Record Type 0091
  Error 1: Previous Definition Different : ?swapBE cat  YAXAAF Z (void 
 cdecl cat::swapBE(short &))
 objs\RakClient.obj(RakClient)  Offset 0017DH Record Type 0091
  Error 1: Previous Definition Different : ?getBE cat  YAHH Z (int cdecl 
 cat::getBE(int ))
 objs\RakClient.obj(RakClient)  Offset 00195H Record Type 0091
  Error 1: Previous Definition Different : ?getBE cat  YAFF Z (short 
 cdecl cat::getBE(short ))
 objs\RakClient.obj(RakClient)  Offset 00333H Record Type 0091
  Error 1: Previous Definition Different : 
 ?next_highest_power_of_2  YAII Z (unsigned cdecl 
 next_highest_power_of_2(unsigned ))
 objs\rakclientglue.obj(rakclientglue)  Offset 000DDH Record Type 0091
  Error 1: Previous Definition Different : 
 ?UNASSIGNED_PLAYER_ID  3UPlayerID  B (const PlayerID UNASSIGNED_PLAYER_ID)
 objs\RakNetworkFactory.obj(RakNetworkFactory)  Offset 000C5H Record Type 
 0091
  Error 1: Previous Definition Different : 
 ?UNASSIGNED_PLAYER_ID  3UPlayerID  B (const PlayerID UNASSIGNED_PLAYER_ID)
 objs\RakNetworkFactory.obj(RakNetworkFactory)  Offset 000E6H Record Type 
 0091
  Error 1: Previous Definition Different : ?swapBE cat  YAXAAI Z (void 
 cdecl cat::swapBE(unsigned &))
 objs\RakNetworkFactory.obj(RakNetworkFactory)  Offset 00101H Record Type 
 0091
  Error 1: Previous Definition Different : ?swapBE cat  YAXAAG Z (void 
 cdecl cat::swapBE(unsigned short &))
 objs\RakNetworkFactory.obj(RakNetworkFactory)  Offset 00119H Record Type 
 0091
  Error 1: Previous Definition Different : ?getBE cat  YAII Z (unsigned 
 cdecl cat::getBE(unsigned ))
 objs\RakNetworkFactory.obj(RakNetworkFactory)  Offset 00131H Record Type 
 0091
  Error 1: Previous Definition Different : ?getBE cat  YAGG Z (unsigned 
 short cdecl cat::getBE(unsigned short ))
 objs\RakNetworkFactory.obj(RakNetworkFactory)  Offset 00152H Record Type 
 0091
  Error 1: Previous Definition Different : ?swapBE cat  YAXAAH Z (void 
 cdecl cat::swapBE(int &))
 objs\RakNetworkFactory.obj(RakNetworkFactory)  Offset 0016DH Record Type 
 0091
  Error 1: Previous Definition Different : ?swapBE cat  YAXAAF Z (void 
 cdecl cat::swapBE(short &))
 objs\RakNetworkFactory.obj(RakNetworkFactory)  Offset 00185H Record Type 
 0091
  Error 1: Previous Definition Different : ?getBE cat  YAHH Z (int cdecl 
 cat::getBE(int ))
 objs\RakNetworkFactory.obj(RakNetworkFactory)  Offset 0019DH Record Type 
 0091
  Error 1: Previous Definition Different : ?getBE cat  YAFF Z (short 
 cdecl cat::getBE(short ))
 objs\RakNetworkFactory.obj(RakNetworkFactory)  Offset 001C9H Record Type 
 0091
  Error 1: Previous Definition Different : 
 ?next_highest_power_of_2  YAII Z (unsigned cdecl 
 next_highest_power_of_2(unsigned ))
 objs\RakPeer.obj(RakPeer)  Offset 000BBH Record Type 0091
  Error 1: Previous Definition Different : 
 ?UNASSIGNED_PLAYER_ID  3UPlayerID  B (const PlayerID UNASSIGNED_PLAYER_ID)
 objs\RakPeer.obj(RakPeer)  Offset 000DCH Record Type 0091
 

Yes, I discussed "similar" errors earlier.... I think at dsource.org. DMC, for some reason, imports every instance of "const PlayerID UNASSIGNED_PLAYER_ID;" into each object file, instead of making a single global instance of it. UNASSIGNED_PLAYER_ID is located in raknet\include\NetworkTypes.h. PlayerID is a struct with operator overloads declared in the same file. For some reason, any file that includes this header, seems to get a separate UNASSIGNED_PLAYER_ID added to the global space. When you try to put all objects together in a library... I'm guessing they conflict. I don't know if that's how it works, but it sure seems to. The best I can think of is to follow Walter's suggestion and use obj2asm on each object file to see what symbols are in there. I don't know how to prevent this. It's certainly very strange. -JJR
Nov 24 2005
prev sibling parent reply "Walter Bright" <newshound digitalmars.com> writes:
"clayasaurus" <clayasaurus gmail.com> wrote in message
news:dm66eh$2f50$1 digitaldaemon.com...
   Error 1: Previous Definition Different : ?getBE cat  YAGG Z (unsigned
 short cdecl cat::getBE(unsigned short ))
 objs\RakNetworkFactory.obj(RakNetworkFactory)  Offset 00152H Record Type
 0091

That means getBE(unsigned short) is multiply defined. Doing a grep for the identifier in the .obj files should help.
Nov 24 2005
parent reply clayasaurus <clayasaurus gmail.com> writes:
Walter Bright wrote:
 "clayasaurus" <clayasaurus gmail.com> wrote in message
 news:dm66eh$2f50$1 digitaldaemon.com...
 
  Error 1: Previous Definition Different : ?getBE cat  YAGG Z (unsigned
short cdecl cat::getBE(unsigned short ))
objs\RakNetworkFactory.obj(RakNetworkFactory)  Offset 00152H Record Type
0091

That means getBE(unsigned short) is multiply defined. Doing a grep for the identifier in the .obj files should help.

Ahh thanks. I've managed to get my symbol error list down to... objs\DataBlockEncryptor.obj(DataBlockEncryptor) Error 42: Symbol Undefined ?set_key AES128 QAEXQBE Z (void syscall AES128::set_key(unsigned char const *const )) objs\RakPeer.obj(RakPeer) Error 42: Symbol Undefined ?DecodeArray HuffmanEncodingTree QAEXPAEHPAVBitStream RakNet Z (void syscall HuffmanEncodingTree::DecodeArray(unsigned char *,int ,BitStream::RakNet *)) objs\RakPeer.obj(RakPeer) Error 42: Symbol Undefined ?EncodeArray HuffmanEncodingTree QAEXPAEHPAVBitStream RakNet Z (void syscall HuffmanEncodingTree::EncodeArray(unsigned char *,int ,BitStream::RakNet *)) objs\RakPeer.obj(RakPeer) Error 42: Symbol Undefined ??1HuffmanEncodingTree QAE XZ (syscall HuffmanEncodingTree::~HuffmanEncodingTree(void )) objs\RakPeer.obj(RakPeer) Error 42: Symbol Undefined ?GenerateFromFrequencyTable HuffmanEncodingTree QAEXPAI Z (void syscall HuffmanEncodingTree::GenerateFromFrequencyTable(unsigned *)) objs\RakPeer.obj(RakPeer) Error 42: Symbol Undefined ??0HuffmanEncodingTree QAE XZ (syscall HuffmanEncodingTree::HuffmanEncodingTree(void )) objs\RakPeer.obj(RakPeer) Error 42: Symbol Undefined ?_beginthreadex YAKPAXIP6GI0 Z0IPAI Z (unsigned long cdecl _beginthreadex(void *,unsigned ,unsigned stdcall (*)(void *),void *,unsigned ,unsigned *)) objs\StringCompressor.obj(StringCompressor) Error 42: Symbol Undefined ?DecodeArray HuffmanEncodingTree QAEHPAVBitStream RakNet HHPAE Z (int syscall HuffmanEncodingTree::DecodeArray(BitStream::RakNet *,int ,int ,unsigned char *)) and here is the result of grep "set_key" in my object directory... AES128.obj:..?set_key AES128 QAEXPBE Z.. DataBlockEncryptor.obj:.?set_key AES128 QAEXQBE Z I'm going to play around with the source some more, but if anything is immedietely obvious or if you have any helpful hints/suggestions they would be much appreciated. Thanks. ~ Clay
Nov 24 2005
parent reply clayasaurus <clayasaurus gmail.com> writes:
nevermind I've managed to get it down to just

Error 42: Symbol Undefined ?_beginthreadex  YAKPAXIP6GI0 Z0IPAI Z
(unsigned long cdecl _beginthreadex(void *,unsigned ,unsigned stdcall
(*)(void *),void *,unsigned ,unsigned *))
objs\StringCompressor.obj(StringCompressor)

now.

clayasaurus wrote:
 Walter Bright wrote:
 
 "clayasaurus" <clayasaurus gmail.com> wrote in message
 news:dm66eh$2f50$1 digitaldaemon.com...

  Error 1: Previous Definition Different : ?getBE cat  YAGG Z (unsigned
 short cdecl cat::getBE(unsigned short ))
 objs\RakNetworkFactory.obj(RakNetworkFactory)  Offset 00152H Record Type
 0091

That means getBE(unsigned short) is multiply defined. Doing a grep for the identifier in the .obj files should help.

Ahh thanks. I've managed to get my symbol error list down to... objs\DataBlockEncryptor.obj(DataBlockEncryptor) Error 42: Symbol Undefined ?set_key AES128 QAEXQBE Z (void syscall AES128::set_key(unsigned char const *const )) objs\RakPeer.obj(RakPeer) Error 42: Symbol Undefined ?DecodeArray HuffmanEncodingTree QAEXPAEHPAVBitStream RakNet Z (void syscall HuffmanEncodingTree::DecodeArray(unsigned char *,int ,BitStream::RakNet *)) objs\RakPeer.obj(RakPeer) Error 42: Symbol Undefined ?EncodeArray HuffmanEncodingTree QAEXPAEHPAVBitStream RakNet Z (void syscall HuffmanEncodingTree::EncodeArray(unsigned char *,int ,BitStream::RakNet *)) objs\RakPeer.obj(RakPeer) Error 42: Symbol Undefined ??1HuffmanEncodingTree QAE XZ (syscall HuffmanEncodingTree::~HuffmanEncodingTree(void )) objs\RakPeer.obj(RakPeer) Error 42: Symbol Undefined ?GenerateFromFrequencyTable HuffmanEncodingTree QAEXPAI Z (void syscall HuffmanEncodingTree::GenerateFromFrequencyTable(unsigned *)) objs\RakPeer.obj(RakPeer) Error 42: Symbol Undefined ??0HuffmanEncodingTree QAE XZ (syscall HuffmanEncodingTree::HuffmanEncodingTree(void )) objs\RakPeer.obj(RakPeer) Error 42: Symbol Undefined ?_beginthreadex YAKPAXIP6GI0 Z0IPAI Z (unsigned long cdecl _beginthreadex(void *,unsigned ,unsigned stdcall (*)(void *),void *,unsigned ,unsigned *)) objs\StringCompressor.obj(StringCompressor) Error 42: Symbol Undefined ?DecodeArray HuffmanEncodingTree QAEHPAVBitStream RakNet HHPAE Z (int syscall HuffmanEncodingTree::DecodeArray(BitStream::RakNet *,int ,int ,unsigned char *)) and here is the result of grep "set_key" in my object directory... AES128.obj:..?set_key AES128 QAEXPBE Z.. DataBlockEncryptor.obj:.?set_key AES128 QAEXQBE Z I'm going to play around with the source some more, but if anything is immedietely obvious or if you have any helpful hints/suggestions they would be much appreciated. Thanks. ~ Clay

Nov 24 2005
parent reply "Walter Bright" <newshound digitalmars.com> writes:
"clayasaurus" <clayasaurus gmail.com> wrote in message
news:dm6epb$2lfa$1 digitaldaemon.com...
 nevermind I've managed to get it down to just

 Error 42: Symbol Undefined ?_beginthreadex  YAKPAXIP6GI0 Z0IPAI Z
 (unsigned long cdecl _beginthreadex(void *,unsigned ,unsigned stdcall
 (*)(void *),void *,unsigned ,unsigned *))
 objs\StringCompressor.obj(StringCompressor)

_beginthreadex is declared in \dm\include\process.h. But it's supposed to have C linkage, not C++ linkage as your reference is looking for.
Nov 25 2005
parent reply clayasaurus <clayasaurus gmail.com> writes:
Walter Bright wrote:
 "clayasaurus" <clayasaurus gmail.com> wrote in message
 news:dm6epb$2lfa$1 digitaldaemon.com...
 
nevermind I've managed to get it down to just

Error 42: Symbol Undefined ?_beginthreadex  YAKPAXIP6GI0 Z0IPAI Z
(unsigned long cdecl _beginthreadex(void *,unsigned ,unsigned stdcall
(*)(void *),void *,unsigned ,unsigned *))
objs\StringCompressor.obj(StringCompressor)

_beginthreadex is declared in \dm\include\process.h. But it's supposed to have C linkage, not C++ linkage as your reference is looking for.

Thanks, that was it. I had to declare _beginthreadex explicitly since for some reason it wasn't being pulled from process.h, so I just added extern "C" linkage and it works. So, now finally, after thousands of errors, I got raknet to compile under DMC and have D sucessfully link to it! For the minimum testing I've done so far, the networking works with the windows machine talking to itself. I'm going to clean things up a bit and do some more testing. Thanks for your help Walter and John! I couldn't have pulled it off without any help. I'll have the changes up on the bindings project shortly. ~ Clay
Nov 25 2005
next sibling parent John Reimer <terminal.node gmail.com> writes:
clayasaurus wrote:

 Thanks, that was it. I had to declare _beginthreadex explicitly since 
 for some reason it wasn't being pulled from process.h, so I just added 
 extern "C" linkage and it works.
 
 So, now finally, after thousands of errors, I got raknet to compile 
 under DMC and have D sucessfully link to it!
 
 For the minimum testing I've done so far, the networking works with the 
 windows machine talking to itself. I'm going to clean things up a bit 
 and do some more testing.
 
 Thanks for your help Walter and John! I couldn't have pulled it off 
 without any help.
 
 I'll have the changes up on the bindings project shortly.
 
 ~ Clay

Bravo! Good work! I'm glad you persisted. You were rewarded with success in the end. -JJR
Nov 25 2005
prev sibling parent "Walter Bright" <newshound digitalmars.com> writes:
"clayasaurus" <clayasaurus gmail.com> wrote in message
news:dm7kdb$14jr$1 digitaldaemon.com...
 So, now finally, after thousands of errors, I got raknet to compile
 under DMC and have D sucessfully link to it!

 For the minimum testing I've done so far, the networking works with the
 windows machine talking to itself. I'm going to clean things up a bit
 and do some more testing.

 Thanks for your help Walter and John! I couldn't have pulled it off
 without any help.

 I'll have the changes up on the bindings project shortly.

Great! Thank-you.
Nov 25 2005