通过修复 wx-3.0 符号在 Linux Mageia 5 中成功构建 Kicad 4.0.6
Successful build of Kicad 4.0.6 in Linux Mageia 5 via fixing a wx-3.0 symbol
我已经成功地在 Linux Mageia 5.1 和 gcc 4.9.2 版中构建了 Kicad 4.0.6。我首先手动修复了/usr/include/wx-3.0/wx/目录下的两个wxWidgets 3.0.2 header文件:regex.h和features.h。然后 Kicad 编译成功。使用本机 wx-3.0 headers,由于未定义变量 wxRE_ADVANCED.
,编译器在 pcbnew/netlist_reader.cpp 中生成错误
features.hheader检查是否定义了宏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 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)?谢谢。
P.S。是的,Kicad 4.0.6 构建过程成功完成,只有一行添加到顶层 CMakeLists.txt 文件:
add_definitions(-DwxRE_ADVANCED=1)
通过$variable
或${variable}
调用变量。请注意大括号,而不是圆括号。
另外,推荐使用:
target_compile_definitions(mytarget PUBLIC wxRE_ADVANCED=1)
直接在目标上,而不是一般的 add_definitions()
命令。
我已经成功地在 Linux Mageia 5.1 和 gcc 4.9.2 版中构建了 Kicad 4.0.6。我首先手动修复了/usr/include/wx-3.0/wx/目录下的两个wxWidgets 3.0.2 header文件:regex.h和features.h。然后 Kicad 编译成功。使用本机 wx-3.0 headers,由于未定义变量 wxRE_ADVANCED.
,编译器在 pcbnew/netlist_reader.cpp 中生成错误features.hheader检查是否定义了宏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 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)?谢谢。
P.S。是的,Kicad 4.0.6 构建过程成功完成,只有一行添加到顶层 CMakeLists.txt 文件:
add_definitions(-DwxRE_ADVANCED=1)
通过$variable
或${variable}
调用变量。请注意大括号,而不是圆括号。
另外,推荐使用:
target_compile_definitions(mytarget PUBLIC wxRE_ADVANCED=1)
直接在目标上,而不是一般的 add_definitions()
命令。