classi con nomi identici a problemi dell'app e causare lib * dopo * la conversione da Makefile a CMake

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

Domanda

Sto cercando di convertire un programma e il suo plugin da personalizzato Makefiles a CMake, con modifiche minime al codice.

Sia il plugin e la quota di applicazione del codice; #ifdef ... #else ... #endif blocchi sono utilizzati dove ci sono differenze, e sono certo che il codice viene compilato con le definisce corretti. Il codice in comune comprende una classe chiamata ToolImage. Quando il codice è compilato per l'applicazione, il costruttore ToolImage utilizza un percorso risorsa diverso rispetto a quando si è compilato per il 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
{
 ...
}

Quando il programma e il suo plugin sono stati compilati con il costume Makefiles, tutto funziona come previsto. Quando entrambi sono stati compilati con CMake, utilizzando una serie di file CMakeLists.txt che ho creato, c'è un problema: il plugin non è in grado di caricare le bitmap per la sua barra degli strumenti.

I rintracciato il problema alla classe ToolImage. Il numero di riga data dal gdb mi dice che il plugin è utilizzando il costruttore sbagliata. strace mi dice la stessa cosa (il plugin è alla ricerca di suoi bitmap a dir risorse del app piuttosto che in dir risorse del plugin). Per garantire che non ho avuto le definisce avvitato, ho messo un #Error in ToolImage.cpp, all'interno della parte del #ifdef che deve essere compilato solo per l'applicazione - e il plugin ancora compilato senza errori. Questo mi dice che il plugin è la compilazione con il codice corretto. Dal momento che sta usando la strada sbagliata, penso che sta usando la classe e il costruttore di compilato nel programma invece del proprio.

Come faccio a garantire che il plugin usa la propria classe ToolImage invece di quella in app ?! Non possiedo il progetto e non voglio fare enormi cambiamenti solo per sostenere la costruzione di un sistema di generazione diversa.

Uso della pre-compilatore per creare due versioni di una classe sembra una cattiva scelta per me. Se devo apportare modifiche al codice, hai suggerimenti per una soluzione alternativa?

È stato utile?

Soluzione 2

I risolto questo con l'aggiunta della bandiera linker -Wl, -Bsymbolic-funzioni nella CMakeLists.txt:

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

Altri suggerimenti

Per motivi di esperimento, mi piacerebbe aggiungere -fvisibility = nascosto quando si costruisce theApp, a tutti o forse alcune fonti specifiche. Questo dovrebbe nascondere ToolImage dell'applicazione dal plugin.

Non è un metodo universale, come in molti casi i plugin utilizzati simboli diversi dalla eseguibile principale.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top