2010-09-02 18 views
7

Yazdığım bir program için bir çeşit eklenti mimarisi yapmayı deniyorum ve ilk denememde sorun yaşıyorum. Paylaşılan nesneden ana yürütülebilir dosyadan sembollere erişmek mümkün mü? Düşündüm iyi olurdu şunlardır:paylaşılan nesne, ana ikilide sembolleri bulamıyor, C++

testlib.cpp:

void foo(); 
void bar() __attribute__((constructor)); 
void bar(){ foo(); } 

testexe.cpp:

g++ -fPIC -o testexe testexe.cpp -ldl 
g++ --shared -fPIC -o testlib.so testlib.cpp 

Çıktı:

attempting to load 
fail: ./testlib.so: undefined symbol: _Z3foov 

#include <iostream> 
#include <dlfcn.h> 

using namespace std; 

void foo() 
{ 
    cout << "dynamic library loaded" << endl;  
} 

int main() 
{ 
    cout << "attempting to load" << endl; 
    void* ret = dlopen("./testlib.so", RTLD_LAZY); 
    if(ret == NULL) 
     cout << "fail: " << dlerror() << endl; 
    else 
     cout << "success" << endl; 
    return 0; 
} 

ile Derleyen

Açıkçası, bu iyi değil. Yani sanırım iki sorum var: 1) Paylaşılan nesnenin çalıştırılabilir dosyada yer almasını sağlayan bir yol var mı? 2) Eğer değilse, eklentileri kullanan programlar genellikle nasıl kod almayı başardıklarını çalışırlar. kendi programlarında çalışmak için paylaşılan nesneler?

cevap

16

Dene: (-Wl,--export-dynamic gibi ya da bir şey eşdeğeri) -rdynamic olmadan

g++ -fPIC -rdynamic -o testexe testexe.cpp -ldl 

, uygulamadan semboller kendisi dinamik bağlantı için kullanılabilir olmayacak.

+0

Evet! Çok çok teşekkür ederim. – cheshirekow

+1

https://gcc.gnu.org/onlinedocs/gcc-4.8.3/gcc/Link-Options.html 'ye göre, aynı etki gcc bağlantı adımına "-dinamik" seçeneği ile sağlanabilir. –

+0

@TomBarron Teşekkürler! Gönderiyi güncelleyeceğim. –