digitalmars.D.announce - basic raknet bindings for D
- clayasaurus (20/20) Nov 23 2005 Bindings here --> http://svn.dsource.org/projects/bindings/trunk/raknet/
- Walter Bright (2/2) Nov 24 2005 Did you email raknet and ask them to support DMC? Such things usually ca...
- John Reimer (44/48) Nov 24 2005 It seems that the RakNet developers know about DMC. When you try to
- clayasaurus (16/77) Nov 24 2005 I actually got a little bit farther than that compiling Raknet myself.
- John Reimer (15/100) Nov 24 2005 Pffff. How stupid of me. I should have thought of trying that. Thanks.
- Walter Bright (6/10) Nov 24 2005 I wouldn't be surprised if it turned out to be easier to recode in D tha...
- John Reimer (11/22) Nov 24 2005 I tried again, got a little further, and finally gave up. It was just
- Charles (6/59) Nov 24 2005 Here here!
- Walter Bright (7/13) Nov 24 2005 can
- John Reimer (20/42) Nov 24 2005 Well we're in trouble then. I bet the RakNet developer got a grand
- Walter Bright (15/35) Nov 24 2005 I know it may seem futile from your end, but those emails do make a
- clayasaurus (2/6) Nov 24 2005 I sent a feature request in their forum to support DMC.
- John Reimer (2/10) Nov 24 2005 And I sent one directly to the author.
- John Reimer (2/16) Nov 24 2005 A nice one, mind you. I didn't sound cranky like I did here. ;)
- clayasaurus (132/159) Nov 24 2005 I finally applied numerous hacks to get raknet to build under the DMC
- John Reimer (18/158) Nov 24 2005 All I can say is a heartfelt "Wow." I had given up. You didn't. What I...
- Walter Bright (4/8) Nov 24 2005 That means getBE(unsigned short) is multiply defined. Doing a grep for t...
- clayasaurus (41/54) Nov 24 2005 Ahh thanks. I've managed to get my symbol error list down to...
- clayasaurus (7/73) Nov 24 2005 nevermind I've managed to get it down to just
- Walter Bright (4/9) Nov 25 2005 _beginthreadex is declared in \dm\include\process.h. But it's supposed t...
- clayasaurus (13/28) Nov 25 2005 Thanks, that was it. I had to declare _beginthreadex explicitly since
- John Reimer (4/21) Nov 25 2005 Bravo! Good work! I'm glad you persisted. You were rewarded with
- Walter Bright (3/11) Nov 25 2005 Great! Thank-you.
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
Did you email raknet and ask them to support DMC? Such things usually can help a lot.
Nov 24 2005
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
John Reimer wrote:Walter Bright 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'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. ~ ClayDid 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
clayasaurus wrote:John Reimer wrote:Pffff. How stupid of me. I should have thought of trying that. Thanks. I did try using NULL, but it wouldn't recognize it.Walter Bright 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;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. -JJRHowever, 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. ~ ClayI 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
"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
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
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 constGood 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:canDid you email raknet and ask them to support DMC? Such things usuallyhelp 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
"John Reimer" <terminal.node gmail.com> wrote in message news:dm59ii$1739$1 digitaldaemon.com...Walter Bright wrote:canDid you email raknet and ask them to support DMC? Such things usuallyThem 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>.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"
Nov 24 2005
Walter Bright wrote:"John Reimer" <terminal.node gmail.com> wrote in message news:dm59ii$1739$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. 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. -JJRWalter Bright wrote:canDid you email raknet and ask them to support DMC? Such things usuallyThem 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>.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"
Nov 24 2005
"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
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
clayasaurus wrote:Walter Bright wrote:And I sent one directly to the author.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
John Reimer wrote:clayasaurus wrote:A nice one, mind you. I didn't sound cranky like I did here. ;)Walter Bright wrote:And I sent one directly to the author.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
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
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 0091Yes, 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
"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 0091That means getBE(unsigned short) is multiply defined. Doing a grep for the identifier in the .obj files should help.
Nov 24 2005
Walter Bright wrote:"clayasaurus" <clayasaurus gmail.com> wrote in message news:dm66eh$2f50$1 digitaldaemon.com...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. ~ ClayError 1: Previous Definition Different : ?getBE cat YAGG Z (unsigned short cdecl cat::getBE(unsigned short )) objs\RakNetworkFactory.obj(RakNetworkFactory) Offset 00152H Record Type 0091That means getBE(unsigned short) is multiply defined. Doing a grep for the identifier in the .obj files should help.
Nov 24 2005
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...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. ~ ClayError 1: Previous Definition Different : ?getBE cat YAGG Z (unsigned short cdecl cat::getBE(unsigned short )) objs\RakNetworkFactory.obj(RakNetworkFactory) Offset 00152H Record Type 0091That means getBE(unsigned short) is multiply defined. Doing a grep for the identifier in the .obj files should help.
Nov 24 2005
"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
Walter Bright wrote:"clayasaurus" <clayasaurus gmail.com> wrote in message news:dm6epb$2lfa$1 digitaldaemon.com...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. ~ Claynevermind 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
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. ~ ClayBravo! Good work! I'm glad you persisted. You were rewarded with success in the end. -JJR
Nov 25 2005
"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