公司的新项目使用了NXP LPC1768单片机,供应商提供的开发环境是Eclipse,我们在搭建Eclipse开发环境时遇到了一个奇葩的问题。我们首先按照供应商的建议安装了如下软件:
- OpenOCD,使用Olimex官方的版本(0.9.0-rc1),解压后放置C盘根目录下,手动设置环境变量,不同于OpenOCD 0.6.0,这个版本使用时需指定配置文件C:/openocd-0.9.0-rc1/scripts/interface/olimex-arm-usb-ocd-h.cfg
- Zadig,使用2.8版本,用于安装OLIMEX-ARM-USB-OCD-H调试工具的驱动程序
- Yagarto gcc交叉编译工具,使用yagarto-bu-2.23.1_gcc-4.7.2-c-c++_nl-1.20.0_gdb-7.5.1_eabi_20121222.exe,安装过程中会自动设置环境变量
- Yagarto tools工具,使用yagarto-tools-20121018-setup.exe,安装过程中会自动设置环境变量
- Cygwin,选择安装binutils、gcc、gcc-mingw及gdb,参照https://blog.csdn.net/unclejin_/article/details/117385220,安装完成后需要手动设置环境变量
- Eclipse IDE for Embedded C and C++ Developers,使用最新版本
在全部软件安装完成之后,使用Eclipse打开供应商提供的工程文件,尝试编译,出现了如下的错误:
make all
0 [main] sh 5420 sync_with_child: child 10988(0x204) died before initialization with status code 0xC0000142
12 [main] sh 5420 sync_with_child: *** child state waiting for longjmp
/usr/bin/sh: fork: Resource temporarily unavailable
make: Nothing to be done for `all'.
仔细核对安装的软件,没有发现错误。使用Cygwin命令行,进入工程文件夹下,手动make或者make clean都没有错误,说明工具链是好的。折腾一两个小时之后,忽然想起有另外一台电脑可以正常编译,仔细对比两台电脑的软件及环境变量设置,只有Cygwin的目录排序不一样,具体如下:
将无法正常编译的那一台电脑的c:\cygwin64\bin这一条环境变量上移,再次打开Eclipse进行编译,编译过程顺利完成!现在可以确定,就是这一条环境变量的位置导致了之前的错误。看了一下别人分享的内容,原因是这样的:
Windows环境变量的查找顺序是按照文件的录入的顺序从前向后找的,最前面一条的优先级最高,如果找到命令就不会再向后找。因此新增环境变量的时候,最好将新添加的放在最前面以获得最高优先级。
所以说,搞研发就是一个不断发现问题,解决问题的过程,这次又学到新知识了,希望可以帮到读者。