Forum Coders' city Strona Główna Coders' city
Nasza pasja to programowanie!
 

 PomocPomoc   SzukajSzukaj   UżytkownicyUżytkownicy   GrupyGrupy  RejestracjaRejestracja 
Archiwum starego forum + teoria    RSS & Panel/SideBar
 ProfilProfil   Zaloguj się, by sprawdzić wiadomościZaloguj się, by sprawdzić wiadomości   ZalogujZaloguj 

Potrzebuję szybkiej odpowiedzi na moje pytanie... Zasady

[C++] linux - dynamiczne ładowanie symboli które są w namespace



 
Odpowiedz do tematu    Forum Coders' city Strona Główna -> C i C++
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Tomek_kemoT



Dołączył: 31 Sie 2007
Posty: 379
Skąd: Rz-ów

PostWysłany: Sob Maj 30, 2009 8:59 pm  OP    Temat postu: [C++] linux - dynamiczne ładowanie symboli które są w namespace Odpowiedz z cytatem Pisownia

Jak się dynamicznie ładuje symbole w C++, pod linuxem, które są w przestrzeni nazw?
Kod:
namespace przestrzeń
{
   funkcja() { ... }
}
Jak napiszę:
Kod:
dlsym( biblioteka, "funkcja")
lub:
Kod:
dlsym( biblioteka, "przestrzeń::funkcja")

to twierdzi że nie ma takiego symbolu.

W C nie mam problemów. Chyba że w C++ robi się to inaczej?
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
izaw



Dołączył: 12 Wrz 2008
Posty: 2180
Skąd: Łódź

PostWysłany: Sob Maj 30, 2009 9:08 pm      Temat postu: Odpowiedz z cytatem Pisownia

W C++ jest manglowanie (poczytaj) nazw i dlatego nie ma takiej nazwy.
Musisz użyć konstrukcji
Kod:
extern "C"

przy deklaracji funkcji.
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
Tomek_kemoT



Dołączył: 31 Sie 2007
Posty: 379
Skąd: Rz-ów

PostWysłany: Nie Maj 31, 2009 11:56 am  OP    Temat postu: Odpowiedz z cytatem Pisownia

Działa tak:
Kod:
namespace przestrzeń
{
extern "C" void funkcja() { .... }
}
Tylko że mi takie rozwiązanie się nie podoba.
1. Teraz funkcja nie jest już w przestrzeni nazw - a w C++ tworząc bibliotekę chce żeby była.
2. Nie chcę aby tylko jedna funkcja mogła być dynamicznie ładowana, tylko wszystkie symbole, a wtedy powinienem dać blok extern "C" { ... }, i po co mi wtedy i tak pusta przestrzeń nazw?
3. I pytanie techniczne - blok extern "C" { ... } powoduje że wszystko co jest wewnątrz tego bloku jest kompilowane zgodnie z zasadami języka C - więc jak w takim blok napiszę strukturę - to będzie traktowana jak struktura C a nie C++, więc np. nie może mieć konstruktora, albo jak napiszę funkcję to nie może rzucać wyjątków - czyli defakto taka biblioteka będzie napisana w C a nie w C++ - a nie o to mi chodzi.

Czy libtool nie rozwiązuje problemu - czy po prostu na linuxie niemożliwe jest dynamiczne ładowanie bibliotek C++ ?
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
marcin_an



Dołączył: 26 Maj 2005
Posty: 18822

PostWysłany: Nie Maj 31, 2009 12:53 pm      Temat postu: Odpowiedz z cytatem Pisownia

1/2. W C nie ma przestrzeni nazw, więc nie możesz wymagać, by była przestrzeń nazw.

3. extern "C" nie zmienia sposobu kompilacji, lecz sposób linkowania. W tym przypadku powoduje, że zostanie wyeksportowany symbol funkcja, a nie przemielona nazwa funkcji z C++ z uwzględnieniem przestrzeni nazw, przeciążeń itd.

Linux, jak zresztą spora część systemów operacyjnych, dostosowana jest do jednego wybranego języka - C. To samo dotyczy bibliotek - zasadniczo nie działają z czymkolwiek innym. Binarki niektórych starszych języków łatwo sprowadzić do poziomu akceptowanego przez biblioteki. Nie liczyłbym jednak na to, by dało się tak samo robić z nowoczesnymi językami. W przypadku C++ sytuacja jest jeszcze o tyle dobra, że dzięki przemaglowaniu nazw symboli i extern "C" można mieszać fragmenty napisane w C i C++. Jednak w wielu innych językach - np. Javie lub Pythonie, takich rzeczy już się nie zrobi, więc generalnie trzeba "odciąć" się od niskopoziomowych aspektów systemu.

W tym przypadku po prostu zrezygnuj dla tej jednej funkcji z przestrzeni nazw. Nie wiem, do czego ci to potrzebne, ale podejrzewam, że do jakiejś wtyczki. Zatem przecież potrzebujesz mieć po prostu dostęp do instancji klasy reprezentującej wtyczkę - do tego wystarczy jedna funkcja lub nawet zmienna.
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
dburchardt
Gość





PostWysłany: Nie Sty 14, 2018 11:37 pm      Temat postu: Odpowiedz z cytatem Pisownia

Moglibyście pokazać przykład jak nadpisać metodę klasy w namespace innym niż std?
Powrót do góry
Wyświetl posty z ostatnich:   
Odpowiedz do tematu    Forum Coders' city Strona Główna -> C i C++ Wszystkie czasy w strefie CET (Europa)

Strona 1 z 1

 
Skocz do:  
Możesz pisać nowe tematy
Możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Możesz dodawać załączniki na tym forum
Możesz pobierać pliki z tego forum




Debug: strone wygenerowano w 0.24544 sekund, zapytan = 11
contact

| Darmowe programy i porady Jelcyna | Tansze zakupy w Helionie | MS Office Blog |