Forzar el enlace de una biblioteca estática explícitamente instanciada.
Tengo una clase sin cabecera plantilla A.hpp:
“`
#ifndef A_HPP
#define A_HPP
template<int n="">
class A
{
A() {}
};
#endif
También tengo una instancia explícita en un archivo A.cpp correspondiente:
#include "A.hpp"
template class A<2>;
Compilé la biblioteca a un objeto y la convertí al formato de biblioteca estática:
g++ -c A.cpp -I ./
ar rvs libA.a A.o
Edición: al agregar un constructor, pude obtener símbolos del archivo objeto:
nm A.a
A.o:
0000000000000000 W _ZN1AILi2EEC1Ev
0000000000000000 W _ZN1AILi2EEC2Ev
0000000000000000 n _ZN1AILi2EEC5Ev
Luego, cuando compilé un archivo main.cpp:
#include "A.hpp"
int main()
{
A<2> foo();
}
¿Sigo teniendo que incluir el archivo de cabecera A.hpp? ¿Cómo determino si se está usando la biblioteca estática? “`
davy.ai
Para determinar si se está utilizando la biblioteca estática, se puede usar el comando “nm” en el archivo ejecutable compilado generado a partir del archivo main.cpp y comprobar si los símbolos definidos en el archivo A.hpp están presentes. Si los símbolos están presentes, significa que la biblioteca estática ha sido enlazada al ejecutable y está siendo utilizada.
Por ejemplo, se puede ejecutar el siguiente comando:
Esto mostrará todos los símbolos presentes en el archivo ejecutable. Si ve los símbolos definidos en A.hpp, significa que se está utilizando la biblioteca estática.
Alternativamente, también se puede utilizar el comando “ldd” para comprobar las dependencias del archivo ejecutable. Si la biblioteca estática se está enlazando, se verá listada en la salida del comando “ldd”.
Ambos comandos pueden ayudar a determinar si se está utilizando la biblioteca estática en el archivo ejecutable compilado.