Успешная сборка Kicad 4.0.6 в Linux Mageia 5 с помощью исправления символа wx-3.0
Мне удалось собрать Kicad 4.0.6 в Linux Mageia 5.1 с gcc версии 4.9.2. Сначала я вручную исправил два заголовочных файла wxWidgets 3.0.2 в каталоге /usr/include/wx-3.0/wx/: regex.h и features.h. Kicad затем успешно скомпилирован. С собственными заголовками wx-3.0 компилятор сгенерировал ошибку в pcbnew/netlist_reader.cpp из-за неопределенной переменной wxRE_ADVANCED.
Заголовок features.h проверяет, определен ли макрос WX_NO_REGEX_ADVANCED. Если да, features.h отменяет определение макроса wxHAS_REGEX_ADVANCED и определяет его, если нет. Макрос wxHAS_REGEX_ADVANCED, в свою очередь, используется в regex.h, чтобы определить, присутствует ли среди перечисленных констант wxRE_ADVANCED = 1. Стандарт прекомпилированной Mageia 5 пакетов wxgtku3.0_0 и lib64wxgtku3.0-Devel, что я установил с использованием программного обеспечения менеджером URPMI Mageia в Mageia из хранилища WX_NO_REGEX_ADVANCED определен, поэтому wxHAS_REGEX_ADVANCED не определен, и, следовательно, wxRE_ADVANCED не определен либо. Исходный пакет Kicad 4.0.6 предполагает wxRE_ADVANCED = 1, поэтому процесс сборки останавливается с ошибкой.
Затем я вернул /usr/include/wx-3.0/wx/regex.h и features.h в их первоначальное состояние и узнал, как добавить определение wxRE_ADVANCED в CMakeLists.txt. Однако у меня все еще есть вопрос.
Рекомендуемый формат добавления определения в CMakeLists.txt, который я нашел в командной строке CMake для C++ #define:
if (NOT DEFINED wxRE_ADVANCED)
set(wxRE_ADVANCED 1)
endif()
add_definitions(-DwxRE_ADVANCED=$(wxRE_ADVANCED))
Однако это не сработало! Расширение макроса для wxRE_ADVANCED в pcbnew/netlist_reader.cpp было пустым. Я напечатал его во время компиляции, вставив следующие строки в файл netlist_reader.cpp (это было трудно найти, большинство рекомендуемых форматов не работало. Правильный - в препроцессоре C: разверните макрос в #warning):
#define __STRINGIFY(TEXT) #TEXT
#define __WARNING(TEXT) __STRINGIFY(GCC warning TEXT)
#define WARNING(VALUE) __WARNING(__STRINGIFY(wxRE_ADVANCED = VALUE))
Pragma (WARNING(wxRE_ADVANCED))
Наконец, я упростил определение CMakeLists.txt до этого, и это было успешно:
if (NOT DEFINED wxRE_ADVANCED)
set(wxRE_ADVANCED 1)
endif()
add_definitions(-DwxRE_ADVANCED=1)
Мой вопрос: что означает "-DwxRE_ADVANCED=$(wxRE_ADVANCED)", если он не работает? Можно ли не использовать set(wxRE_ADVANCED 1), а просто написать add_definitions(-DwxRE_ADVANCED=1)? Спасибо.
PS Да, процесс сборки Kicad 4.0.6 успешно завершен с добавлением только одной строки в файл CMakeLists.txt верхнего уровня:
add_definitions(-DwxRE_ADVANCED=1)
1 ответ
Переменная вызывается через $variable
или же ${variable}
, Обратите внимание на фигурные скобки, а не круглые скобки.
Также рекомендуется использовать:
target_compile_definitions(mytarget PUBLIC wxRE_ADVANCED=1)
непосредственно на цель, а не на общую add_definitions()
команда.