des classes de même nom dans les questions d'application et la cause lib * après * conversion de Makefile à CMake

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

Question

Je suis en train de convertir un programme et son plug-in de la coutume Makefile à CMake, avec des changements minimes au code.

Les deux plug-in et la part de l'application un peu de code; #ifdef ... #else ... #endif blocs sont utilisés là où il y a des différences, et je suis certain que le code est compilé avec les définit corrects. Le code partagé comprend une classe appelée ToolImage. Lorsque le code est compilé pour l'application, le constructeur ToolImage utilise un chemin de ressource différente que lorsqu'il est compilé pour le plug-in.

#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
{
 ...
}

Lorsque le programme et son plug-in ont été compilés avec la coutume Makefiles, tout fonctionne comme prévu. Lorsque les deux ont été compilés avec CMake, en utilisant une série de fichiers CMakeLists.txt j'ai créé, il y a un problème: le plug-in ne peut pas charger les bitmaps pour sa barre d'outils.

J'ai suivi le problème à la classe ToolImage. Le numéro de la ligne donnée par gdb me dit que le plugin utilise le mauvais constructeur. strace me dit la même chose (le plug-in est à la recherche de ses ressources dans bitmaps de ressources dir plutôt que dans le plug-in de l'application dir). Pour vous assurer que je n'avais pas les définit foutu, je mets un #error à ToolImage.cpp, dans la partie du #ifdef qui ne devrait être compilé pour l'application - et le plugin encore compilé sans erreur. Cela me dit que le plugin compile avec le bon code. Comme il utilise le mauvais chemin, je pense qu'il utilise la classe et le constructeur compilé dans le programme au lieu de lui-même.

Comment puis-je assurer que le plugin utilise sa propre classe ToolImage au lieu de celui de l'application ?! Je ne possède pas le projet et ne veulent pas apporter des changements massifs simplement pour soutenir la construction d'un système de construction différent.

Utilisation du précompilateur pour créer deux versions d'une classe semble être un mauvais choix pour moi. Si je dois apporter des modifications au code, avez-vous des suggestions pour une solution de contournement?

Était-ce utile?

La solution 2

Je fixe en ajoutant le drapeau de linker -Wl, -Bsymbolic-fonctions dans le CMakeLists.txt:

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

Autres conseils

Par souci d'expérience, j'ajouter -fvisibility = caché lors de la construction theApp, à tout ou peut-être à certaines sources spécifiques. Cela devrait cacher ToolImage de l'application du plug-in.

Il est pas une méthode universelle, comme dans de nombreux cas, les plugins ne comportent différents symboles de l'exécutable principal.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top