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?
Evet! Çok çok teşekkür ederim. – cheshirekow
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. –
@TomBarron Teşekkürler! Gönderiyi güncelleyeceğim. –