从IBM GitHub安装DOOPL时遇Makefile执行错误求助
在Windows上编译DOOPL时遇到Shell语法错误的解决方案
问题重现
编译DOOPL时触发以下错误:
make[1]: Entering directory 'C:/.../Documents/DOOPL/doopl-master/doopl-master/generate/x64_win' if [ ! -d 2211 ]; then mkdir 2211; fi ! était inattendu. make[1]: *** [makefile.build:76: generate] Error 255 make[1]: Leaving directory 'C:/.../Documents/DOOPL/doopl-master/doopl-master/generate/x64_win' make: *** [../makefile:28: build] Error 2
当前使用的Makefile内容:
######################################## COS_VERSION?= 2211 COSDIR?=C:/Users/DM9070/Desktop/IBM/ILOG/CPLEX_Studio2211 PYTHON_TARGET?= 3.8 PYTHON_HOME?= C:/ProgramData/Anaconda3 SWIGDIR?= C:/Users/DM9070/Documents/DOOPL/swigwin-4.1.1 ######################################### OPLDIR =C:/Users/DM9070/Desktop/IBM/ILOG/CPLEX_Studio2211/opl LD_LIBRARY_PATH=$(OPLDIR)/bin/x86-64_linux DYLD_LIBRARY_PATH=$(OPLDIR)/bin/x86-64_osx #PATH=$(OPLDIR)/bin/x64_win64 all: build clean: @echo ================================================ @echo = Cleaning $(COS_VERSION)/$(PYTHON_TARGET) @echo ================================================ $(MAKE) -f makefile.build COS_VERSION=$(COS_VERSION) PYTHON_TARGET=$(PYTHON_TARGET) OPLDIR=$(OPLDIR) clean build: @echo ================================================ @echo = Building for $(COS_VERSION)/$(PYTHON_TARGET) @echo ================================================ $(MAKE) -f makefile.build COS_VERSION=$(COS_VERSION) PYTHON_HOME=$(PYTHON_HOME) SWIGDIR=$(SWIGDIR) PYTHON_TARGET=$(PYTHON_TARGET) OPLDIR=$(OPLDIR) install_in_src all @echo ================================================ @echo = Sanity test run for $(COS_VERSION)/$(PYTHON_TARGET) @echo ================================================ $(MAKE) -f makefile.build COS_VERSION=$(COS_VERSION) PYTHON_HOME=$(PYTHON_HOME) PYTHON_TARGET=$(PYTHON_TARGET) OPLDIR=$(OPLDIR) LD_LIBRARY_PATH=$(LD_LIBRARY_PATH) DYLD_LIBRARY_PATH=$(DYLD_LIBRARY_PATH) test
错误原因
错误信息里的! était inattendu是法语“意外的!”,本质是Windows自带的CMD Shell不兼容类Unix的Bash语法。编译脚本里的if [ ! -d 2211 ]; then mkdir 2211; fi是Bash风格的判断语句,CMD无法识别[、!这类语法,导致执行失败。
解决方案
1. 用类Unix环境执行编译
最稳妥的方式是在Windows上安装MSYS2或Cygwin,它们提供完整的Bash环境和GNU工具链:
- 安装MSYS2后,打开对应的终端(比如
MSYS2 MinGW 64-bit) - 在终端中切换到DOOPL源码目录,运行
make命令
2. 修改makefile.build为Windows兼容格式
找到makefile.build第76行的generate目标,把Bash风格的判断语句替换为CMD兼容写法:
原语句:
if [ ! -d $(COS_VERSION) ]; then mkdir $(COS_VERSION); fi
替换为:
if not exist $(COS_VERSION) mkdir $(COS_VERSION)
3. 调整Makefile中的Windows环境变量
Windows不需要LD_LIBRARY_PATH或DYLD_LIBRARY_PATH,需把OPL的bin目录加入系统PATH:
取消Makefile中#PATH=$(OPLDIR)/bin/x64_win64的注释,修改为:
PATH=$(OPLDIR)/bin/x64_win64;$(PATH)
4. 确保路径格式正确
所有路径统一使用正斜杠(/),或双反斜杠(\\),避免CMD解析路径时出错。
内容的提问来源于stack exchange,提问作者Marceau
相关产品推荐
相关产品推荐

