que tienen un proyecto de C++ que debido a su estructura de directorios se configura como una biblioteca estática A
, que está vinculado a la biblioteca compartida B
, que está vinculada al ejecutable C
. (Este es un proyecto multiplataforma usando CMake, por lo que en Windows obtenemos A.lib
, B.dll
y C.exe
, y en Linux obtenemos libA.a
, libB.so
y C
.) Biblioteca A
tiene una función init (A_init
, definido en A/initA.cpp
), que se llama desde 'función s init (B_init
, definido en B/initB.cpp
), que se llama a partir de C
' B
biblioteca s principal. Por lo tanto, cuando se enlaza B
, A_init
(y todos los símbolos definidos en initA.cpp
) está vinculado en B
(que es nuestro comportamiento deseado).Cómo forzar la inclusión de un archivo de objeto en una biblioteca estática cuando se establece un enlace en ejecutable?
El problema viene en que la biblioteca A
también define una función (Af
, definido en A/Afort.f
) que está destinada a por dinámicamente cargado (es decir LoadLibrary
/GetProcAddress
en Windows y dlopen
/dlsym
en Linux). Dado que no existen referencias a Af
de la biblioteca B
, símbolos de A/Afort.o
no están incluidos en B
. En Windows, podemos crear artificialmente una referencia mediante el pragma:
#pragma comment (linker, "/export:_Af")
Dado que este es un pragma, que sólo funciona en Windows (utilizando Visual Studio 2008). Para conseguir que funcione en Linux, hemos intentado añadir lo siguiente a A/initA.cpp
:
extern void Af(void);
static void (*Af_fp)(void) = &Af;
Esto no causa el símbolo Af
que se incluirán en el último eslabón de B
. ¿Cómo podemos forzar el símbolo Af
a estar vinculado en B
?
C es en realidad una interfaz de lenguaje de scripting, B es el motor de lenguaje y A es un conjunto de métodos de código nativo para que el motor lo use. Estamos implementando un lenguaje preexistente que tiene una interfaz de función externa bien definida. A y B son producidos por equipos separados; preferiríamos mantener todo lo que el equipo A escribe en el directorio A. –