说明如下: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
一旦提取出该版本的netcdf
,cd
将进入输出目录,并运行以下操作(注意要使用该编译器而不是默认编译器构建的CXX=g++-4.9
):
CXX=g++-4.9 ./configure
make
make install
make check
现在回到rnnlib
本身:
您仍然需要应用一些补丁程序才能使rnnlib
与g++-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
不是标准头文件(malloc
在stdlib.h
中声明)。例如,请参阅此堆栈溢出答案。