Ho un progetto C++ che a causa della sua struttura di directory è impostato come una libreria statica A
, che è collegata alla libreria condivisa B
, che è collegata nell'eseguibile C
. (Questo è un progetto cross-platform usando CMake, quindi su Windows otteniamo A.lib
, B.dll
e C.exe
, e su Linux otteniamo libA.a
, libB.so
, e C
.) Libreria A
ha una funzione init (A_init
, definito in A/initA.cpp
), viene chiamata dalla funzione di inizializzazione della libreria B
(B_init
, definita in B/initB.cpp
), che viene chiamata dal menu principale di C
. Pertanto, quando si collega B
, A_init
(e tutti i simboli definiti in initA.cpp
) è collegato a B
(che è il comportamento desiderato).Come forzare l'inclusione di un file oggetto in una libreria statica quando si collega in un file eseguibile?
Il problema nasce dal fatto che la libreria A
definisce anche una funzione (Af
, definito in A/Afort.f
) che è destinato a venire caricata dinamicamente (cioè LoadLibrary
/GetProcAddress
su Windows e dlopen
/dlsym
su Linux). Poiché non vi sono riferimenti a Af
dalla libreria B
, i simboli da A/Afort.o
non sono inclusi in B
. Su Windows, possiamo artificialmente creare un riferimento utilizzando il pragma:
#pragma comment (linker, "/export:_Af")
Poiché questo è un pragma, funziona solo su Windows (utilizzando Visual Studio 2008). Per farlo funzionare su Linux, abbiamo provato ad aggiungere quanto segue a A/initA.cpp
:
extern void Af(void);
static void (*Af_fp)(void) = &Af;
Ciò non causa il simbolo Af
da inserire nel l'ultimo anello di B
. Come possiamo forzare il collegamento del simbolo Af
a B
?
C è in realtà un frontend di linguaggio di script, B è il motore di linguaggio e A è un insieme di metodi di codice nativo per il motore da utilizzare. Stiamo implementando un linguaggio preesistente che ha un'interfaccia di funzione straniera ben definita. A e B sono prodotti da squadre separate; preferiremmo tenere tutto ciò che l'A-team scrive nella directory A. –