2014-09-03 78 views
3

我已经下载the following code错误编译C++时在Matlab的MEX 11代码文件

CVPR 2014交集过工会优化代码

cvpr2014-iou-code-1.0.zip

http://research.microsoft.com/en-us/downloads/e164fe21-ef2b-4e34-98c1-4868968abb06/

我得到的是两个文件夹归档,一个叫src/和另一个称为matlab/。我运行的是Linux Fedora 19,我可以在src/中编译代码。当我尝试在matlab/中编译代码时出现问题。

自述说:

Matlab compilation 
------------------ 
From within Matlab, configure the compiler using "mex -setup", then adjust the 
paths in matlab\compile_windows.m or matlab/compile_linux.m scripts and run 
either "compile_linux.m" or "compile_windows.m" in the "matlab" directory. 

更特别版:

Linux 
===== 

From within Matlab run "mex -setup", then edit the mexopts.sh file and modify 
the settings 

    CXXFLAGS='-std=c++11 -fopenmp -march=native -D_GNU_SOURCE' 
    CXXLIBS="$RPATH $MLIBS -lm -lgomp" 
    CXXOPTIMFLAGS='-Ofast -DNDEBUG' 

This will enable OpenMP and C++11 and should work from G++ 4.7 onwards. 

From the matlab/ directory, call compile_linux to build all mex files. 

于是我打开matlab和运行mex -setup。我回答yes的问题:

>> mex -setup 

    Options files control which compiler to use, the compiler and link command 
    options, and the runtime libraries to link against. 

    Using the 'mex -setup' command selects an options file that is 
    placed in /user/wok/home/.matlab/R2012b and used by default for 'mex'. An options 
    file in the current working directory or specified on the command line 
    overrides the default options file in /user/wok/home/.matlab/R2012b. 

    To override the default options file, use the 'mex -f' command 
    (see 'mex -help' for more information). 

The options files available for mex are: 

    1: /opt/matlab2012b/bin/mexopts.sh : 
     Template Options file for building gcc MEX-files 


    0: Exit with no changes 

Enter the number of the compiler (0-1): 
1 

Overwrite /user/wok/home/.matlab/R2012b/mexopts.sh ([y]/n)? 
y 

/opt/matlab2012b/bin/mexopts.sh is being copied to 
/user/wok/home/.matlab/R2012b/mexopts.sh 


************************************************************************** 
    Warning: The MATLAB C and Fortran API has changed to support MATLAB 
      variables with more than 2^32-1 elements. In the near future 
      you will be required to update your code to utilize the new 
      API. You can find more information about this at: 
      http://www.mathworks.com/help/techdoc/matlab_external/bsflnue-1.html 
      Building with the -largeArrayDims option enables the new API. 
************************************************************************** 

然后我编辑的文件/user/wok/home/.matlab/R2012b/mexopts.sh,我遵循的自述文件的说明:

CXX='g++' 
    CXXFLAGS='-ansi -D_GNU_SOURCE' 
    CXXFLAGS="$CXXFLAGS -D_FILE_OFFSET_BITS=64" 
    CXXFLAGS="$CXXFLAGS -fPIC -pthread" 
    CXXLIBS="$RPATH $MLIBS -lm" 
    CXXOPTIMFLAGS='-O -DNDEBUG' 
    CXXDEBUGFLAGS='-g' 

变为:

CXX='g++' 
    CXXFLAGS='-std=c++11 -fopenmp -march=native -D_GNU_SOURCE' 
    CXXLIBS="$RPATH $MLIBS -lm -lgomp" 
    CXXOPTIMFLAGS='-Ofast -DNDEBUG' 
    CXXDEBUGFLAGS='-g' 

这一步后,我打开matlab和编辑compile_linux.m添加的路径来提高:

% You need to have boost 1.49 or higher installed (package libboost-dev on 
% most distributions) 
% 
% Tested on Ubuntu 13.10, Matlab R2012b, gcc 4.8.1 

% TODO: this assumes that boost headers are available in /usr/include, as on 
% most systems. If you manually installed boost, please add -I/path/to/boost 
mex -v -O ... 
    -output mex_voc_optimize -I../src ... 
    -I/user/wok/home/Softwares/Boost_1.54/include/boost ... 
    mex_voc_optimize.cpp matlab_helpers.cpp ... 
    -largeArrayDims 

编辑:继从禁卫军第一条评论,我已经添加了-v标志。

最后我跑compile_linux,只得到错误的一个长长的清单,我已经缩短,粘贴下面:

>> compile_linux 
-> mexopts.sh sourced from directory (DIR = $PREF_DIR) 
    FILE = /user/wok/home/.matlab/R2012b/mexopts.sh 
---------------------------------------------------------------- 
-> MATLAB    = /opt/matlab2012b 
-> CC     = gcc 
-> CC flags: 
     CFLAGS    = -ansi -D_GNU_SOURCE -fexceptions -fPIC -fno-omit-frame-pointer -pthread 
     CDEBUGFLAGS  = -g 
     COPTIMFLAGS  = -O -DNDEBUG 
     CLIBS    = -Wl,-rpath-link,/opt/matlab2012b/bin/glnxa64 -L/opt/matlab2012b/bin/glnxa64 -lmx -lmex -lmat -lm -lstdc++ 
     arguments   = 
-> CXX     = g++ 
-> CXX flags: 
     CXXFLAGS   = -ansi -D_GNU_SOURCE -fPIC -fno-omit-frame-pointer -pthread 
     CXXDEBUGFLAGS  = -g 
     CXXOPTIMFLAGS  = -O -DNDEBUG 
     CXXLIBS   = -Wl,-rpath-link,/opt/matlab2012b/bin/glnxa64 -L/opt/matlab2012b/bin/glnxa64 -lmx -lmex -lmat -lm 
     arguments   = 
-> FC     = gfortran 
-> FC flags: 
     FFLAGS    = -fexceptions -fbackslash -fPIC -fno-omit-frame-pointer 
     FDEBUGFLAGS  = -g 
     FOPTIMFLAGS  = -O 
     FLIBS    = -Wl,-rpath-link,/opt/matlab2012b/bin/glnxa64 -L/opt/matlab2012b/bin/glnxa64 -lmx -lmex -lmat -lm 
     arguments   = 
-> LD     = g++ 
-> Link flags: 
     LDFLAGS   = -pthread -shared -Wl,--version-script,/opt/matlab2012b/extern/lib/glnxa64/mexFunction.map -Wl,--no-undefined 
     LDDEBUGFLAGS  = -g 
     LDOPTIMFLAGS  = -O 
     LDEXTENSION  = .mexa64 
     arguments   = 
-> LDCXX     = 
-> Link flags: 
     LDCXXFLAGS   = 
     LDCXXDEBUGFLAGS = 
     LDCXXOPTIMFLAGS = 
     LDCXXEXTENSION  = 
     arguments   = 
---------------------------------------------------------------- 


Warning: You are using gcc version "4.8.2". The version 
     currently supported with MEX is "4.4.6". 
     For a list of currently supported compilers see: 
     http://www.mathworks.com/support/compilers/current_release/ 

-> g++ -c -I../src -I/user/wok/home/Softwares/Boost_1.54/include/boost -I/opt/matlab2012b/extern/include -I/opt/matlab2012b/simulink/include -DMATLAB_MEX_FILE -ansi -D_GNU_SOURCE -fPIC -fno-omit-frame-pointer -pthread -O -DNDEBUG "mex_voc_optimize.cpp" 

In file included from /usr/include/c++/4.8.2/cstdint:35:0, 
       from mex_voc_optimize.cpp:8: 
/usr/include/c++/4.8.2/bits/c++0x_warning.h:32:2: error: #error This file requires compiler and library support for the ISO C++ 2011 standard. This support is currently experimental, and must be enabled with the -std=c++11 or -std=gnu++11 compiler options. 
#error This file requires compiler and library support for the \ 
^
In file included from ../src/lfp.h:18:0, 
       from ../src/voc.h:15, 
       from mex_voc_optimize.cpp:19: 
../src/timing.h:15:2: error: ‘chrono’ in namespace ‘std’ does not name a type 
    std::chrono::time_point<std::chrono::high_resolution_clock> start_time; 
^
../src/timing.h: In member function ‘double timer::elapsed_this_period() const’: 
../src/timing.h:20:8: error: ‘std::chrono’ has not been declared 
    std::chrono::time_point<std::chrono::high_resolution_clock> end_time 
     ^
../src/timing.h:20:32: error: ‘std::chrono’ has not been declared 
    std::chrono::time_point<std::chrono::high_resolution_clock> end_time 

直到

../src/voc.h:418:31: note: ‘P’ declared here, later in the translation unit 
    alpha[k_best] += P(j,k_best); 
          ^
../src/voc.h: In instantiation of ‘std::pair<double, double> voc::prediction_function<TFloat>::compute_objective_c(int) const [with TFloat = double]’: 
../src/voc.h:328:56: required from ‘double voc::prediction_function<TFloat>::compute_objective() const [with TFloat = double]’ 
mex_voc_optimize.cpp:250:39: required from here 
../src/voc.h:315:17: error: ‘P’ was not declared in this scope 
    A_c += P(i,c); 
       ^
../src/voc.h:318:17: error: ‘P’ was not declared in this scope 
    D_c += P(i,c); 
       ^

    mex: compile of ' "mex_voc_optimize.cpp"' failed. 

Error using mex (line 206) 
Unable to complete successfully. 

Error in compile_linux (line 9) 
mex -O ... 

>> 

我曾尝试编辑代码以删除每致电chrono(定时器),然后用map等代替unordered_map,但这是一种痛苦。我想能够编译MEX文件中matlab/就像我在src/

+1

添加'-v'到mex命令行来调用它详细模式,你应该能够看到mex传递给gcc的文件和选项。 – Praetorian 2014-09-03 16:16:18

+0

感谢您的建议,我编辑了这个问题。由于某些原因,虽然我编辑了正确的文件,但CXX标志看起来不对。 – Wok 2014-09-03 16:20:25

+0

看来CXX标志在'mexopts.sh'文件中多次出现,并且我没有编辑过所有这些标志。 – Wok 2014-09-03 16:23:09

回答

5

由于编译C++代码Praetorian的评论,我可以查明问题。我在mexopts.sh中编辑了错误的行。实际上,CXXFLAGS出现在3个不同的地方,我在第一个地方编辑过标志,但是在第二个地方编辑它是必要和足够的(第一个地方是诱饵)。

见例如:

$ grep -n CXXLIBS /user/wok/home/.matlab/R2012b/mexopts.sh 
74:    CXXLIBS="$RPATH $MLIBS -lm" 
129:   CXXLIBS="$RPATH $MLIBS -lm" 
199:   CXXLIBS="$MLIBS -lstdc++" 

所以我编辑的线条绕线129以下行

 CXX='g++' 
     CXXFLAGS='-ansi -D_GNU_SOURCE' 
     CXXFLAGS="$CXXFLAGS -fPIC -fno-omit-frame-pointer -pthread" 
     CXXLIBS="$RPATH $MLIBS -lm" 
     CXXOPTIMFLAGS='-O -DNDEBUG' 
     CXXDEBUGFLAGS='-g' 

成为

 CXX='g++' 
     CXXFLAGS='-std=c++11 -fopenmp -march=native -D_GNU_SOURCE' 
     CXXFLAGS="$CXXFLAGS -fPIC -fno-omit-frame-pointer -pthread" 
     CXXLIBS="$RPATH $MLIBS -lm -lgomp" 
     CXXOPTIMFLAGS='-Ofast -DNDEBUG' 
     CXXDEBUGFLAGS='-g'