Я пытаюсь преобразовать программу и ее плагин из пользовательских Makefile в CMake с минимальными изменениями кода.классы с одинаковым именем в приложениях и lib вызывают проблемы * после * преобразования из Makefile в cmake
Оба плагина и приложение имеют некоторый код; #ifdef ... #else ... #endif блоки используются там, где есть различия, и я уверен, что код скомпилирован с правильными определениями. Общий код включает класс ToolImage. Когда код компилируется для приложения, конструктор ToolImage использует другой путь ресурса, чем когда он скомпилирован для плагина.
#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
{
...
}
Когда программа и ее плагин были скомпилированы с помощью пользовательских Make-файлов, все работает так, как ожидалось. Когда оба были скомпилированы с помощью CMake, используя ряд файлов CMakeLists.txt, которые я создал, возникает проблема: плагин не может загрузить растровые изображения для своей панели инструментов.
Я отследил проблему до класса ToolImage. Номер строки, заданный gdb, говорит мне, что плагин использует неправильный конструктор. strace говорит мне то же самое (плагин ищет свои растровые изображения в ресурсе dir ресурса приложения, а не в директории ресурсов плагина). Чтобы убедиться, что у меня не было определений, я поставил #error в ToolImage.cpp, внутри части #ifdef, которую нужно только компилировать для приложения, - и плагин все еще скомпилирован без ошибок. Это говорит мне, что плагин компилируется с правильным кодом. Поскольку он использует неправильный путь, я думаю, что он использует класс и конструктор, скомпилированные в программу, а не самостоятельно.
Как я могу обеспечить, чтобы плагин использовал свой собственный класс ToolImage вместо того, который был в приложении ?! Я не владею проектом и не хочу делать массовые изменения только для поддержки здания с помощью другой системы сборки.
Использование прекомпилятора для создания двух версий класса кажется мне плохим выбором. Если я должен внести изменения в код, есть ли у вас предложения об обходном пути?