由于 CPLEX 中的 iostream.h 而出错
Error due to iostream.h in CPLEX
我已经在运行 High Sierra 的 Mac 上成功安装了 CPLEX 12.8.0。我使用了 R 包 cplexAPI
,它实际上在幕后使用了 C API 来解决线性规划问题,而且它工作得很好。现在我想使用 C++ API;无论如何,我已经在使用 Rcpp 生成非常大的约束矩阵,所以在解决整个线性规划问题之前,我不想在 R 中使用中间对象。我告诉编译器(我使用来自 CRAN 的 clang4)CPLEX 和 Concert 的头文件和库在哪里(通过
PKG_CXXFLAGS=-I/<path to CPLEX>/include -I/<path to concert>/include
和
PKG_LIBS=-L/<path to CPLEX>/lib/x86-64_osx/static_pic -lcplex -lcplexdistmip -lilocplex -L/<path to concert>/lib/x86-64_osx/static_pic -lconcert
在 .R/Makevars 文件中),编译器成功找到了它们。我刚刚在 RStudio 中编译了一个包含 #include <ilcplex/ilocplex.h>
的 cpp 文件。然后我得到这个错误:
/Applications/CPLEX_Studio128/concert/include/ilconcert/ilosys.h:391:10: fatal error: 'iostream.h' file not found
#include <iostream.h>
^~~~~~~~~~~~
1 error generated.
这显然不是我、R、RStudio 或 Rcpp 的错 - 这是 Concert 头文件的问题。然后我打开那个文件;它有很多 if 语句,并且有 #include <iostream>
,这是有效的。它以某种方式将我引导至 #include <ilcplex/ilocplex.h>
。它也可以是 -DIL_STD
预处理器指令。我在 previous question 中读到 IL_STD
可能就是原因。但是,我不知道如何为 R 设置它,那么该怎么做呢? .R/Makevars 中有什么东西吗?好的,我对 C++ 了解不多。非常感谢。
> sessionInfo()
R version 3.4.3 (2017-11-30)
Platform: x86_64-apple-darwin15.6.0 (64-bit)
Running under: macOS High Sierra 10.13.2
Matrix products: default
BLAS: /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib
LAPACK: /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libLAPACK.dylib
locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
attached base packages:
[1] parallel stats graphics grDevices utils datasets methods base
other attached packages:
[1] viridis_0.5.0 viridisLite_0.3.0 rhdf5_2.22.0 RcppParallel_4.3.20
[5] profvis_0.3.4 microbenchmark_1.4-4 data.table_1.10.4-3 doParallel_1.0.11
[9] iterators_1.0.9 foreach_1.4.4 cplexAPI_1.3.3 Matrix_1.2-12
[13] Rcpp_0.12.15 RevoUtils_10.0.7
loaded via a namespace (and not attached):
[1] pillar_1.1.0 compiler_3.4.3 plyr_1.8.4 base64enc_0.1-3 tools_3.4.3
[6] zlibbioc_1.24.0 digest_0.6.15 jsonlite_1.5 evaluate_0.10.1 tibble_1.4.2
[11] gtable_0.2.0 lattice_0.20-35 rlang_0.1.6 yaml_2.1.16 gridExtra_2.3
[16] stringr_1.2.0 knitr_1.19 htmlwidgets_1.0 rprojroot_1.3-2 grid_3.4.3
[21] rmarkdown_1.8 ggplot2_2.2.1 magrittr_1.5 backports_1.1.2 scales_0.5.0
[26] codetools_0.2-15 htmltools_0.3.6 colorspace_1.3-2 stringi_1.1.6 lazyeval_0.2.1
[31] munsell_0.4.3
您可以在包含 ilcplex/ilocplex.h
之前在 Rcpp 代码中定义 IL_STD
。
或者,您可以在 PKG_CXXFLAGS
的定义中包含 -DIL_STD
。
我已经在运行 High Sierra 的 Mac 上成功安装了 CPLEX 12.8.0。我使用了 R 包 cplexAPI
,它实际上在幕后使用了 C API 来解决线性规划问题,而且它工作得很好。现在我想使用 C++ API;无论如何,我已经在使用 Rcpp 生成非常大的约束矩阵,所以在解决整个线性规划问题之前,我不想在 R 中使用中间对象。我告诉编译器(我使用来自 CRAN 的 clang4)CPLEX 和 Concert 的头文件和库在哪里(通过
PKG_CXXFLAGS=-I/<path to CPLEX>/include -I/<path to concert>/include
和
PKG_LIBS=-L/<path to CPLEX>/lib/x86-64_osx/static_pic -lcplex -lcplexdistmip -lilocplex -L/<path to concert>/lib/x86-64_osx/static_pic -lconcert
在 .R/Makevars 文件中),编译器成功找到了它们。我刚刚在 RStudio 中编译了一个包含 #include <ilcplex/ilocplex.h>
的 cpp 文件。然后我得到这个错误:
/Applications/CPLEX_Studio128/concert/include/ilconcert/ilosys.h:391:10: fatal error: 'iostream.h' file not found
#include <iostream.h>
^~~~~~~~~~~~
1 error generated.
这显然不是我、R、RStudio 或 Rcpp 的错 - 这是 Concert 头文件的问题。然后我打开那个文件;它有很多 if 语句,并且有 #include <iostream>
,这是有效的。它以某种方式将我引导至 #include <ilcplex/ilocplex.h>
。它也可以是 -DIL_STD
预处理器指令。我在 previous question 中读到 IL_STD
可能就是原因。但是,我不知道如何为 R 设置它,那么该怎么做呢? .R/Makevars 中有什么东西吗?好的,我对 C++ 了解不多。非常感谢。
> sessionInfo()
R version 3.4.3 (2017-11-30)
Platform: x86_64-apple-darwin15.6.0 (64-bit)
Running under: macOS High Sierra 10.13.2
Matrix products: default
BLAS: /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib
LAPACK: /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libLAPACK.dylib
locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
attached base packages:
[1] parallel stats graphics grDevices utils datasets methods base
other attached packages:
[1] viridis_0.5.0 viridisLite_0.3.0 rhdf5_2.22.0 RcppParallel_4.3.20
[5] profvis_0.3.4 microbenchmark_1.4-4 data.table_1.10.4-3 doParallel_1.0.11
[9] iterators_1.0.9 foreach_1.4.4 cplexAPI_1.3.3 Matrix_1.2-12
[13] Rcpp_0.12.15 RevoUtils_10.0.7
loaded via a namespace (and not attached):
[1] pillar_1.1.0 compiler_3.4.3 plyr_1.8.4 base64enc_0.1-3 tools_3.4.3
[6] zlibbioc_1.24.0 digest_0.6.15 jsonlite_1.5 evaluate_0.10.1 tibble_1.4.2
[11] gtable_0.2.0 lattice_0.20-35 rlang_0.1.6 yaml_2.1.16 gridExtra_2.3
[16] stringr_1.2.0 knitr_1.19 htmlwidgets_1.0 rprojroot_1.3-2 grid_3.4.3
[21] rmarkdown_1.8 ggplot2_2.2.1 magrittr_1.5 backports_1.1.2 scales_0.5.0
[26] codetools_0.2-15 htmltools_0.3.6 colorspace_1.3-2 stringi_1.1.6 lazyeval_0.2.1
[31] munsell_0.4.3
您可以在包含 ilcplex/ilocplex.h
之前在 Rcpp 代码中定义 IL_STD
。
或者,您可以在 PKG_CXXFLAGS
的定义中包含 -DIL_STD
。