我已经在运行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>/includePKG_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

最佳答案

您只需在Rcpp代码中定义IL_STD,然后再添加ilcplex/ilocplex.h即可。

另外,您可以在-DIL_STD的定义中包括PKG_CXXFLAGS

08-16 00:14