1

我已经设法在 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) 
4

1 回答 1

2

通过$variable或调用变量${variable}。注意大括号,而不是括号。

此外,建议使用:

target_compile_definitions(mytarget PUBLIC wxRE_ADVANCED=1)

直接针对目标,而不是一般add_definitions()命令。

于 2017-07-16T20:02:54.320 回答