clases con nombres idénticos en cuestiones de aplicaciones y causar lib * * después de la conversión de Makefile para cmake

StackOverflow https://stackoverflow.com/questions/4675481

Pregunta

Estoy tratando de convertir un programa y su plug-in de la costumbre Makefile a CMake, con cambios mínimos en el código.

Tanto el plugin y la cuota de aplicación de un código; #ifdef ... #endif ... #else bloques se utilizan cuando hay diferencias, y estoy seguro de que el código se compila con las define correctas. El código compartido incluye una clase llamada ToolImage. Cuando se compila el código de la aplicación, el constructor ToolImage utiliza una ruta del recurso diferente que cuando se compila para el plugin.

#ifdef THE_APP
 ToolImage::ToolImage(const wxString& name, bool full_path_given):wxImage(full_path_given?name:
 (wxGetApp().GetResFolder() + _T("/bitmaps/") + name + _T(".png")), wxBITMAP_TYPE_PNG)
#else
 ToolImage::ToolImage(const wxString& name, bool full_path_given):wxImage(full_path_given?name:
 (theApp.GetResFolder() + _T("/bitmaps/") + name + _T(".png")), wxBITMAP_TYPE_PNG)
#endif
{
 ...
}

Cuando el programa y su complemento se ha procedido con la costumbre Makefile, todo funciona como se esperaba. Cuando ambos se han compilado con CMake, utilizando una serie de archivos CMakeLists.txt he creado, hay un problema: el plugin no es capaz de cargar los mapas de bits para su barra de herramientas.

Me rastreado el problema a la clase ToolImage. El número de línea determinado por el BGF me dice que el plugin está utilizando el constructor mal. strace me dice lo mismo (el plugin está buscando a sus mapas de bits en dir de recursos de la aplicación en lugar de en el directorio de recursos del plug-in). Para asegurarse de que no tenía los define jodido, puse un #error en ToolImage.cpp, dentro de la parte de la #ifdef que sólo debe ser compilado para la aplicación - y el plugin todavía compilado sin errores. Esto me dice que el plugin está recopilando con el código correcto. Puesto que se utiliza el camino equivocado, creo que está utilizando el constructor de clase y compilado en el programa en lugar de su propio.

¿Cómo me aseguro de que el plugin utiliza su propia clase ToolImage en lugar de la de la aplicación ?! No soy dueño del proyecto y no quiero hacer cambios masivos simplemente para apoyar la construcción de un sistema de construcción diferente.

Uso del precompilador para crear dos versiones de una clase parece una mala elección para mí. Si tengo que hacer cambios en el código, ¿tiene sugerencias para una solución?

¿Fue útil?

Solución 2

I fija esto añadiendo la bandera enlazador -Wl, -Bsymbolic-funciones en la CMakeLists.txt:

set_target_properties( heekscnc PROPERTIES LINK_FLAGS -Wl,-Bsymbolic-functions )

Otros consejos

En aras de la experimentación, me gustaría añadir -fvisibility = escondido en la construcción de theApp, a todo o tal vez algunas fuentes específicas. Esto debería ocultar ToolImage de aplicación desde el plugin.

No es un método universal, como en muchos casos plugins hacen uso de diferentes símbolos del ejecutable principal.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top