Tjena! Varför måste du använda STLPort? Jo, som jag förklarar i texten så sker krockarna när jag skall anropa functioner i boost som tar in parameter av t.ex. typen std::pair. anledningen är att anrop till funktionerna görs men parametrarna är ändrade till stlp_std::pair vilket gör att funktionen inte hittas. denna konvertering körs i libbarna så jag kan inte styra det... Har också försökt att hacka funktionerna i libben för att göra så att dom tar in stlp_std istället... men det funkade inte (har inga specifika felmeddelanden på det just nu)Att länka STLport och BOOST implementationer..
Lite om vad jag försöker göra: Jag försöker modifiera DC++ klienten () så att man kan ladda ner torrent filer i samma miljö och samt se nerladdningar osv... till detta så använder jag mig utav ett library som kallas för libtorrent (). Problem ligger i grunden att DC++ använder sig utav STLport () och att libtorrent använder sig utav Boost (), dessa krockar rätt friskt med varandra...
Efter att ha suttit med problemet i över en vecka nu och läst documentation fram och tillbaka.. så fick jag ett mail häromdan som påminnde om att pellesoft finns :D . Så nu tänkte jag att ni kanske någon här har någon erfarenhet med detta eller att någon skulle kunna ge mig någon hint hur man löser följande problem. Skulle vara roligt om jag lyckades lösa det. Det ska tilläggas att jag har gjort en annan lösning som skapar två applikationer som kommunicerar med varandra och på det sättet håller dom isär men att så gärna vill få detta att funka för att det vore en mycket finare lösning!
Iaf jag orkar inte skriva om allt som jag har postat på diverse forum osv så jag har helt enkelt cut-paste:at in det här under. Det första kommer från ett forumsinlägg det andra är från en mailinglista.
--------
Hello everyone. I must say that after reading through the forums I have had many ideas to how I should solve my problem but as time goes by I am more and more afraid that this will end up on the shelf of unsolved problems. Anyway as a last effort I wanted to ask you if you have a solution to my problem.
If it is the case that this has been posted before I am sorry for taking you time and you could please redirect me to that post. I myself has not found a real answer on the forum. So here goes..
Im working on a project to include bittorrent functionality into DC++. The library that I use for this is libtorrent, which in turn uses boost library. DC++ on the other hand uses STLport.
I have built boost with STL support (compiled with "-sTOOLS=vc7-1_stlport"), I have built STL with boost support (#define _STLP_USE_BOOST_SUPPORT 1) and all the libraries are reachable and my code compiles perfectly. After alot of headache and research (did I mention that Im fairly new to C++) involving different calling conventions etc... I realized that the linking error I received occurs when I try to call for example a function that takes std::pair it is getting called as stlp_std::pair. Ofcourse this function does not exist since it expects std and not stlp_std... so the way I figure it I have 2 options..
I can somehow stop every std call to be called as stlp_std by configuring stlport somehow (remove the prefix). I tried #define _STLP_NO_EXTENSIONS 1 but it doesnt seem to work and probably isnt even related, but the description isnt that great so I gave it a shot .
or I could make sure that all the std in libtorrent are changed to stlp_std.
so either way I have to make them consistent right?
This is the error message I get after I narrowed it down to one single line.
client.lib(Torrent.obj) : error LNK2019: unresolved external symbol "public: bool __thiscall libtorrent::session::listen_on(struct stlp_std::pair<int,int> const &,char const *)" (?listen_on@session@libtorrent@@QAE_NABU?$pair@HH@stlp_std@@PBD@Z) referenced in function "public: __thiscall Torrent::Torrent(void)" (??0Torrent@@QAE@XZ)
the function definition is:
bool listen_on(std::pair<int, int> const& port_range, const char* net_interface = 0);
and is called like this:
s->listen_on(std::pair<int,int>(8991,8999));
Anyone who has any idea on how to solve this issue?
Im using STLport 5.0 and MS VC++ 7.1
-----
I am on the same project as Marcus and as of now we have been working on another solution which involves creating two process that communicate instead of merging the two libraries, however I am still on this as a side project because I refuse to think that it is impossible to do, but I am at the verge of giving up :)
anyway... I have compiled the boost libraries with stlport support and I am doing it like this with bjam:
bjam "-sTOOLS=vc-7_1-stlport" "-sBUILD=<cxxflags>-Gr release" "-sSTLPORT_PATH=d:\dev\stlport-5.0" --with-filesystem --without-python stage
I am doing the same for date_time and thread packages (although I get some strange errors in thread which are not of importance right now). This solves the error posted by Marcus (Also I recompiled STL with boost support which probably also helped out alot).
Anyway so from this I get the libraries that is asked for when I try to compile the whole project... the problem though is that I now get these four errors:
client.lib(Torrent.obj) : error LNK2001: unresolved external symbol "public: bool __thiscall libtorrent::session::listen_on(struct stlp_std::pair<int,int> const &,char const *)" (?listen_on@session@libtorrent@@QAE_NABU?$pair@HH@stlp_std@@PBD@Z)
client.lib(Torrent.obj) : error LNK2001: unresolved external symbol "public: class libtorrent::entry & __thiscall libtorrent::entry::operator[](class stlp_std::basic_string<char,class stlp_std::char_traits<char>,class stlp_std::allocator<char> > const &)" (??Aentry@libtorrent@@QAEAAV01@ABV?$basic_string@DV?$char_traits@D@stlp_std@@V?$allocator@D@2@@stlp_std@@@Z)
client.lib(session.obj) : error LNK2001: unresolved external symbol "public: static void __fastcall boost::thread::sleep(struct boost::xtime const &)" (?sleep@thread@boost@@SIXABUxtime@2@@Z)
client.lib(session.obj) : error LNK2001: unresolved external symbol "int __fastcall boost::xtime_get(struct boost::xtime *,int)" (?xtime_get@boost@@YIHPAUxtime@1@H@Z)
The Torrent.obj file is my own and there I simply make this call (first error):
tSession->listen_on(std::pair<int,int>(8991, 8999));
second error is from this line:
this->e = libtorrent::bdecode(buf, buf+size);
(This works when the two projects are separated)
the problem seem to be that it tries to call the function with stlp_std:: instead of just std:: and that function does not exist (well... it does but with another parameter ;) and that the changes stl has on the project misses the boost library?
anyway so the problem I have now are these for errors and I was thinking that maybe it has to do with how I compile boost? I feel that I am standing quite clueless fronting this error because I feel I have tried everything... Ive compiled boost and stlport 200+ times and read the same documentation 800+ times hehe... there MUST be something that I am missing.
Anyone who has a clue or tip on how to solve it? Does the command line I use when compiling boost library seem ok? or is there any obvious mistake that I should correct?
---
Någon som har nån tanke om detta =) ? Tack på förhand ni som orkat läsa så här långt ner :DSv: Att länka STLport och BOOST implementationer..
Har inte använt det själv men det är väl bara en implementation av standarden STL. Borde det inte fungera lika bra att använda Dinkumwares STL implementation som följer med VC7?
Förstår inte vad du menar att STLPort krockar med Boost. Alla funktioner i Boost använder ju namnrymden boost::.Sv:Att länka STLport och BOOST implementationer..
Japp jag "måste" använda STLPort, DC++ använder det. Har dock inte testat Dinkumwares STL istället för STLPort så det är definitivt nått jag måste testa dock är jag skeptisk till om det löser problemet... men tack för tipset :D