无法安装RNNLIB(http://sourceforge.net/p/rnnl/wiki/Home/)在Mac OSX



说明如下:http://sourceforge.net/p/rnnl/wiki/Home/

我打字/在RNNLIb文件夹的根目录中进行配置。

输出:

   checking for a BSD-compatible install... /usr/bin/install -c
   checking whether build environment is sane... yes
   checking for a thread-safe mkdir -p... build-aux/install-sh -c -d
   checking for gawk... no
   checking for mawk... no
   checking for nawk... no
   checking for awk... awk
   checking whether make sets $(MAKE)... yes
   checking for g++... g++
   checking for C++ compiler default output file name... a.out
   checking whether the C++ compiler works... yes
   checking whether we are cross compiling... no
   checking for suffix of executables... 
   checking for suffix of object files... o
   checking whether we are using the GNU C++ compiler... yes
   checking whether g++ accepts -g... yes
   checking for style of include used by make... GNU
   checking dependency style of g++... gcc3 
   checking for gcc... gcc
   checking whether we are using the GNU C compiler... yes
   checking whether gcc accepts -g... yes
   checking for gcc option to accept ISO C89... none needed
   checking dependency style of gcc... gcc3
   checking for a BSD-compatible install... /usr/bin/install -c
   checking for main in -lstdc++... yes
   checking for exp in -lm... yes
   checking for main in -lnetcdf... yes
   checking for main in -lnetcdf_c++... no
   checking how to run the C++ preprocessor... g++ -E
   checking for grep that handles long lines and -e... /usr/bin/grep
   checking for egrep... /usr/bin/grep -E
   checking for ANSI C header files... yes
   checking for sys/types.h... yes
   checking for sys/stat.h... yes
   checking for stdlib.h... yes
   checking for string.h... yes
   checking for memory.h... yes
   checking for strings.h... yes
   checking for inttypes.h... yes
   checking for stdint.h... yes
   checking for unistd.h... yes
   checking time.h usability... yes
   checking time.h presence... yes
   checking for time.h... yes
   checking malloc.h usability... no
   checking malloc.h presence... no
   checking for malloc.h... no
   configure: creating ./config.status
   config.status: creating Makefile
   config.status: creating src/Makefile
   config.status: creating config.h
   config.status: config.h is unchanged
   config.status: executing depfiles commands

    checking malloc.h usability... no
    checking malloc.h presence... no

    checking for main in -lnetcdf_c++... no

所有退货编号

然后我输入make,得到:

  g++ -DHAVE_CONFIG_H -I. -I..     -g -O2 -MT DataExporter.o -MD -MP -MF     .deps/DataExporter.Tpo -c -o DataExporter.o DataExporter.cpp
  In file included from DataExporter.cpp:18:
  In file included from ./DataExporter.hpp:24:
 ./Helpers.hpp:724:18: error: expected expression
    out << t.get<0>() << " " << t.get<1>();
                    ^
 ./Helpers.hpp:724:39: error: expected expression
    out << t.get<0>() << " " << t.get<1>();
 ... A bunch more similar error messages ...
 In file included from DataExporter.cpp:18:
 In file included from ./DataExporter.hpp:25:
 In file included from ./SeqBuffer.hpp:21:
 In file included from ./MultiArray.hpp:31:
 ./Container.hpp:113:14: warning: reference 'front' is not yet bound   
 to a value
  when used within its own initialization [-Wuninitialized]
            T& front = front();
               ~~~~~   ^~~~~
 1 warning and 14 errors generated.
 make[2]: *** [DataExporter.o] Error 1
 make[1]: *** [all-recursive] Error 1
 make: *** [all] Error 2

我不知道该怎么解决。是什么导致了这些错误,我该如何消除它们?

看起来这是为GNU C++编译器设计的(而不是Yosemite中伪装成g++的Clang编译器),所以使用该编译器进行编译会更容易。

如果你没有Homebrew软件包管理器,你可以通过执行来安装它

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

现在通过运行:安装gcc 4.9

brew install gcc49

GNU C++编译器现在将以g++-4.9的形式提供。

接下来,必须安装兼容版本的netcdf库(而不是最新版本)。请参阅此堆栈溢出问题,或者直接下载ftp://ftp.unidata.ucar.edu/pub/netcdf/netcdf-cxx-4.2.tar.gz

一旦提取出该版本的netcdfcd将进入输出目录,并运行以下操作(注意要使用该编译器而不是默认编译器构建的CXX=g++-4.9):

CXX=g++-4.9 ./configure
make
make install
make check

现在回到rnnlib本身:

您仍然需要应用一些补丁程序才能使rnnlibg++-4.9一起编译(但补丁程序比使用Clang时要少),如本sourceforge线程中所述。

src/Helpers.hpp中首次使用四个range_min_size模板函数之前,需要移动它们的定义。src/Container.hpp还需要一个小补丁来将resize()方法调用为this->resize()。这是补丁:

diff -Naur rnnlib_orig/src/Container.hpp rnnlib_gcc_test/src/Container.hpp
--- rnnlib_orig/src/Container.hpp   2013-08-16 11:00:38.000000000 +0100
+++ rnnlib_gcc_test/src/Container.hpp   2015-03-18 21:30:11.000000000 +0000
@@ -154,7 +154,7 @@
    }
    template<class R> Vector<T>& operator =(const R& r)
    {
-       resize(boost::size(r));
+       this->resize(boost::size(r));
        copy(r, *this);
        return *this;
    }
diff -Naur rnnlib_orig/src/Helpers.hpp rnnlib_gcc_test/src/Helpers.hpp
--- rnnlib_orig/src/Helpers.hpp 2013-08-20 10:39:39.000000000 +0100
+++ rnnlib_gcc_test/src/Helpers.hpp 2015-03-18 21:29:47.000000000 +0000
@@ -296,6 +296,22 @@
    }
    return count;
 }
+template<class R1, class R2> static size_t range_min_size (const R1& a, const R2& b)
+{
+        return min(boost::size(a), boost::size(b));
+}
+template<class R1, class R2, class R3> static size_t range_min_size (const R1& a, const R2& b, const R3& c)
+{
+        return min(min(boost::size(a), boost::size(b)), boost::size(c));
+}
+template<class R1, class R2, class R3, class R4> static size_t range_min_size (const R1& a, const R2& b, const R3& c, const R4& d)
+{
+        return min(min(min(boost::size(a), boost::size(b)), boost::size(c)), boost::size(d));
+}
+template<class R1, class R2, class R3, class R4, class R5> static size_t range_min_size (const R1& a, const R2& b, const R3& c, const R4& d, const R5& e)
+{
+        return min(min(min(min(boost::size(a), boost::size(b)), boost::size(c)), boost::size(d)), boost::size(e));
+}
 template <class R1, class R2> static pair<zip_iterator<tuple<typename range_iterator<R1>::type, typename range_iterator<R2>::type> >,
                                            zip_iterator<tuple<typename range_iterator<R1>::type, typename range_iterator<R2>::type> > > 
 zip(R1& r1, R2& r2)
@@ -529,22 +545,6 @@
        delete *it;
    }
 }
-template<class R1, class R2> static size_t range_min_size (const R1& a, const R2& b)
-{
-   return min(boost::size(a), boost::size(b));
-}
-template<class R1, class R2, class R3> static size_t range_min_size (const R1& a, const R2& b, const R3& c)
-{
-   return min(min(boost::size(a), boost::size(b)), boost::size(c));
-}
-template<class R1, class R2, class R3, class R4> static size_t range_min_size (const R1& a, const R2& b, const R3& c, const R4& d)
-{
-   return min(min(min(boost::size(a), boost::size(b)), boost::size(c)), boost::size(d));
-}
-template<class R1, class R2, class R3, class R4, class R5> static size_t range_min_size (const R1& a, const R2& b, const R3& c, const R4& d, const R5& e)
-{
-   return min(min(min(min(boost::size(a), boost::size(b)), boost::size(c)), boost::size(d)), boost::size(e));
-}
 template <class R> static int arg_max(const R& r)
 {
    return distance(boost::begin(r), max_element(boost::begin(r), boost::end(r)));

或者从Github gist下载这个补丁,因为它不太容易出错:https://gist.github.com/0David/13d872c88172c75d4663

您可以通过cd将其应用于rnnlib目录并运行:

patch -p1 < ../patch.txt

(将patch.txt替换为您命名的上述修补程序文件)。

现在,您必须再次运行configure,指定g++-4.9(因此它将获取我们刚刚构建的netcdf库),然后运行make:

CXX=g++-4.9 ./configure
make

现在您将有一个可运行的bin/rnnlib可执行文件(如果您愿意,可以使用make install安装)。

如果您确实需要Clang,那么这个Stackoverflow问题涉及到了导致问题中显示的编译错误的问题,因此src/Helpers.hpp需要更新以用t.template get<0>替换t.get<0>等调用,但除此之外还有更多的编译问题,因此使用GNU C++构建更容易。

checking malloc.h usability... no
checking malloc.h presence... no

你不需要担心;malloc.h不是标准头文件(mallocstdlib.h中声明)。例如,请参阅此堆栈溢出答案。

最新更新