我已经成功地在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。如果是,则将.h UNdefines wxHAS_REGEX_ADVANCED宏作为特征,如果否,则对其进行定义。反过来,在regex.h中使用宏wxHAS_REGEX_ADVANCED来确定枚举常量中是否存在wxRE_ADVANCED =1。我使用Mageia存储库WX_NO_REGEX_ADVANCED中的Mageia软件管理器安装的标准预构建Mageia5包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 preprocessor: 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)?谢谢。
附注:是的,Kicad 4.0.6构建过程成功完成,但在顶层CMakeLists.txt文件中只添加了一行:
add_definitions(-DwxRE_ADVANCED=1) 发布于 2017-07-17 04:02:54
通过$variable或${variable}调用变量。注意大括号,而不是圆括号。
另外,建议使用:
target_compile_definitions(mytarget PUBLIC wxRE_ADVANCED=1)直接在目标上,而不是一般的add_definitions()命令。
https://stackoverflow.com/questions/45132762
复制相似问题