我已经设法在 Linux Mageia 5.1 中使用 gcc 版本 4.9.2 构建 Kicad 4.0.6。我首先手动修复了/usr/include/wx-3.0/wx/目录下的两个wxWidgets 3.0.2头文件:regex.h和features.h。Kicad 然后编译成功。使用原生 wx-3.0 头文件时,由于未定义变量 wxRE_ADVANCED,编译器在 pcbnew/netlist_reader.cpp 中生成错误。
features.h 头文件检查是否定义了宏 WX_NO_REGEX_ADVANCED。如果是, features.h 取消定义 wxHAS_REGEX_ADVANCED 宏,并定义它,如果不是。反过来,宏 wxHAS_REGEX_ADVANCED 在 regex.h 中用于确定枚举常量 wxRE_ADVANCED = 1 中是否存在。我使用 Mageia 存储库 WX_NO_REGEX_ADVANCED 中的 Mageia 软件管理器 urpmi 安装的标准预构建 Mageia 5 软件包 wxgtku3.0_0 和 lib64wxgtku3.0-devel 已定义,因此 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 中。但是,我还有一个问题。
我在CMake command line for C++ #define中找到的将定义添加到 CMakeLists.txt 的推荐格式是:
if (NOT DEFINED wxRE_ADVANCED)
set(wxRE_ADVANCED 1)
endif()
add_definitions(-DwxRE_ADVANCED=$(wxRE_ADVANCED))
但是,它没有用!pcbnew/netlist_reader.cpp 中 wxRE_ADVANCED 的宏扩展为空。我在编译时打印它,将以下行插入到 netlist_reader.cpp 文件中(这很难找到,大多数推荐的格式都不起作用。正确的格式在C 预处理器中:expand macro in a #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)