Dizin yapısı nedeniyle, C
çalıştırılabilir içine bağlanan B
paylaşılan kitaplığına bağlı bir statik kitaplık A
olarak ayarlanmış bir C++ projem var. (Windows üzerinde biz A.lib
, B.dll
olsun böylece bu, CMake kullanarak çapraz platform projedir ve C.exe
ve Linux üzerinde aldığımız libA.a
, libB.so
ve C
.) Kütüphane A
(A/initA.cpp
tanımlanan A_init
) init işlevi vardır, Bu, C
ana adlı kitaptan çağrılan B
init işlevinden (, B/initB.cpp
olarak tanımlanmıştır) çağrılmaktadır. Böylece, B
, A_init
(ve initA.cpp
'da tanımlanan tüm semboller) bağlanırken B
'a (istediğiniz davranışımıza) bağlanır.Bir nesne dosyasının bir çalıştırılabilir dosyaya bağlanırken statik kitaplığa dahil edilmesine nasıl zorlanır?
sorun A
kütüphanesi de dinamik olarak yüklenmiş tarafından tasarlanmıştır (A/Afort.f
tanımlanan Af
) bir fonksiyon (Windows LoadLibrary
/GetProcAddress
ve Linux dlopen
/dlsym
yani) tanımlar gelir. B
kitaplığından Af
referansı olmadığından, A/Afort.o
sembolleri B
'a dahil değildir. Windows'ta, biz yapay olarak pragma kullanarak bir başvuru oluşturabilirsiniz:
#pragma comment (linker, "/export:_Af")
bu pragma olduğundan, sadece (Visual Studio 2008 kullanılarak) Windows üzerinde çalışır. Linux üzerinde çalışan almak için, biz A/initA.cpp
aşağıdaki ekleyerek denedim: Bu sembol Af
B
nihai bağlantı dahil edilecek yol açmaz
extern void Af(void);
static void (*Af_fp)(void) = &Af;
. Af
sembolünün B
'a bağlanması için nasıl zorlayabiliriz? Eğer B oluştururken
C aslında bir betik dili ön harfidir, B dil motorudur ve A, motorun kullanacağı bir dizi yerel kod yöntemidir. İyi tanımlanmış bir yabancı fonksiyon arayüzüne sahip önceden var olan bir dili uyguluyoruz. A ve B ayrı ekipler tarafından üretilir; A-ekibinin A dizininde yazdığı her şeyi tutmayı tercih ederiz. –