Repast HPC Tutorial学习操作中出现的问题及解决办法(更新ing)

      利用Repast HPC官方提供的虚拟机方法进入虚拟的linux系统(具体操作见 Repast HPC 2.0安装及实例模型运行总结),根据其Repast HPC Tutorial进行实际操作

问题一:

      在做此步操作时点击打开链接

   Compile and link the code using:

make RepastHPC_Demo_00

即在做编译链接操作的时候,发现编译是成功的,生成了对应的.o文件,可是并没有生成对应的可执行文件。并且提示有一个错误

/usr/bin/ld: cannot find -lboost_mpi-mt-s
/usr/bin/ld: cannot find -lboost_serialization-mt-s
/usr/bin/ld: cannot find -lboost_system-mt-s
/usr/bin/ld: cannot find -lboost_filesystem-mt-s
collect2: ld returned 1 exit status
make: *** [RepastHPC_Demo_00] Error 1

关于/usr/bin/ld: cannot find -lXXX问题解决办法可以参考这篇文章:点击打开链接

不过这篇文章并未解决我的问题,我总是出现上面的问题。


初步估计是其work目录的env文件中的值没有更新的缘故,env文件内容如下:

#*******************************

#
# Repast HPC Tutorial
# ENVIRONMENT DEFINITIONS
#
#*******************************

MPICXX=/usr/bin/mpicxx

BOOST_INCLUDE=-I/Users/murphy/ext/boost_1.53/include/
BOOST_LIB_DIR=-L/Users/murphy/ext/boost_1.53/lib/
BOOST_LIBS=-lboost_mpi-mt-s -lboost_serialization-mt-s -lboost_system-mt-s -lboost_filesystem-mt-s

REPAST_HPC_INCLUDE=-I/Users/murphy/work/HWM/REPAST_HPC/
REPAST_HPC_LIB_DIR=-L/Users/murphy/work/HWM/REPAST_HPC/lib

REPAST_HPC_LIB=-lrepast_hpc_gcc


我修改成这样再试

#*******************************

#
# Repast HPC Tutorial
# ENVIRONMENT DEFINITIONS
#
#*******************************

MPICXX=/usr/bin/mpicxx

BOOST_INCLUDE=-I/Users/murphy/ext/boost/boost_1.54/include/
BOOST_LIB_DIR=-L/Users/murphy/ext/boost/boost_1.54/lib/
BOOST_LIBS=-lboost_mpi-mt-s -lboost_serialization-mt-s -lboost_system-mt-s -lboost_filesystem-mt-s

REPAST_HPC_INCLUDE=-I/Users/murphy/work/HWM/REPAST_HPC/
REPAST_HPC_LIB_DIR=-L/Users/murphy/work/HWM/REPAST_HPC/lib

REPAST_HPC_LIB=-lrepast_hpc_gcc


可是并不是像我想象的那样就成功了。。。试了多种方法还是还是没有成功o(╯□╰)o

正当我要放弃的时候,看到了在看指南下一节准备加入BOOST的时候,提到要修改env文件,我突然想到我是直接下载的源码,env里面的路径设置已经做好了,但是我现在这一步可能压根就用不到那些路径。然后我就把上面env文件内容改为:

#*******************************

#
# Repast HPC Tutorial 
# ENVIRONMENT DEFINITIONS
#
#*******************************

MPICXX=/usr/bin/mpicxx


然后再运行

make RepastHPC_Demo_00
命令发现果然成功了!生成了对应的可执行文件。
问题就在我放弃的时候终于得到了解决,其实我就算不用上面的make命令来编译连接也行,自己手动编译连接就成了。

主要是我没想到那env文件里面的其他行也有这么大的影响。而指南中只说把MPICXX=改为MPICXX=/usr/bin/mpicxx,并没有提到此外该文件不应该有其他路径设置。

这也算是直接用源码的教训,如果自己新建一个env文件然后这样加一行进去,这个问题就完全避免了。不过还好问题终于还是解决了,而且我当时看到错误的思路也是正确的,也知道问题出在env文件上,可是自己对于这个文件的作用不是很熟悉,只能查资料,然后慢慢尝试修正。

继续Repast HPC Tutorial之旅!

====================我是华丽的分割线===================================================

问题二      

        话说上面虽然走了弯路,但是经过这么一折腾,发现后面的出现问题的时候,解决起来就非常轻松了,因为我在解决上面一个问题的时候确实花费了很多精力很多方法,而且很多方法都试了也没成功,当时很是纳闷,当问题解决的时候又觉得自己很可笑。说到这,下面一个问题又来了,经过上面的问题的锤炼,这个问题解决起来可真是轻松多了,so easy 妈妈再也不用担心我的学习了。哈哈,好了,闲话不多说,进入正题。

       在操作repast HPC Tiutorial的这一步的时候:RepastHPC_Demo_00_Step_04由于开始使用的是MPI,现在需要换成boost的MPI,在编译和链接的时候用以前的方式均可能出现编译和链接不通过的情况。

       原来的头文件为#include <mpi.h>, 现在的为#include <boost/mpi.hpp>,编译不通的原因是虽然编译器知道mpi的头文件和库在哪,但是它不知道boost库在那。因此在想要通过编译我们需要手动告诉编译器boost库在哪(用“-I”来指定路径)或者嫌麻烦可以直接在env文件做相应修改(至于怎么修改,客官莫慌,请往后看)。

      先来讲手动编译需要怎么做,原来的编译方式如下:

       mpicxx -c -o Demo_00.o Demo_00.cpp

      现在需要用“-I”告诉编译器boost库在哪,repast HPC指南上写道现在的编译方式如下:

    mpicxx -c -I/external_libraries/Boost_1.46_1/include/ -o Demo_00.o Demo_00.cpp

      可惜的是,如果你这样做,还是会出错的,你需要看看自己的电脑上的boost究竟在哪,然后对上面路径做修改,结合我自己电脑上所装的boost库及所在路径,我的正确执行的编译如下:

 mpicxx -c -I/home/repasthpc/Desktop/RHPC_2.0/ext/Boost/Boost_1.54/include/ -o Demo_00.o Demo_00.cpp

      编译这事到此就说完了,下面说说链接,链接的时候也是同上面编译一样,情况还有稍微复杂一点,链接需要指定boost所在文件夹(用“-L”来指定文件夹),另外还需要说明用到哪些库(用小写的L“-l”来指定库),因此此时的链接如下:

mpicxx -L/Users/murphy/ext/boost_1_46_1/stage/lib/ -o Demo_00.exe Demo_00.o -lboost_mpi-xgcc42-mt -lboost_serialization-xgcc42-mt -lboost_system-xgcc42-mt -lboost_filesystem-xgcc42-mt
      不过可惜这在我的电脑上还是会报一些can't find XX的提示,需要结合自己电脑上的实际目录做修改,另外所用到的boost库的库文件也可能由于boost版本不同造成库文件名称不同的情况,这也需要对应自己电脑上的库文件做修改,结合我电脑上的实际情况修改如下:

mpicxx -L/home/repasthpc/Desktop/RHPC_2.0/ext/Boost/Boost_1.54/lib  -o Demo_00.exe Demo_00.o -lboost_mpi-mt-s -lboost_serialization-mt-s -lboost_system-mt-s -lboost_filesystem-mt-s

      补充说明:通过上面可以看到repastHPC指南中所用电脑的对应库文件为

boost_mpi-xgcc42-mt
boost_serialization-xgcc42-mt 
boost_system-xgcc42-mt 
boost_filesystem-xgcc42-mt

     而实际在我的系统中对应库文件则为 boost_mpi-mt-s;boost_serialization-mt-s;boost_system-mt-s;      boost_filesystem-mt-s

     可以看出每次编译都要写这么长的命令,确实比较麻烦,下面我们修改env文件来完成上面操作,env文件中变量应该设置成如下:

BOOST_INCLUDE=-I/Users/murphy/ext/boost_1_46_1/
BOOST_LIB_DIR=-L/Users/murphy/ext/boost_1_46_1/stage/lib/
BOOST_LIBS=-lboost_mpi-xgcc42-mt -lboost_serialization-xgcc42-mt -lboost_system-xgcc42-mt -lboost_filesystem-xgcc42-mt
     恩,经过上面的步骤后,我们现在肯定能一下就看出问题的所在,就是这些库的路径和库文件名称可能与我们实际操作的电脑上的路径与名称不一致,所以我们还是得根据实际情况做修改。下面是我的修改后env文件内容:

#*******************************
#
# Repast HPC Tutorial
# ENVIRONMENT DEFINITIONS
#
#*******************************

MPICXX=/usr/bin/mpicxx

BOOST_INCLUDE=-I/home/repasthpc/Desktop/RHPC_2.0/ext/Boost/Boost_1.54/include/
BOOST_LIB_DIR=-L/home/repasthpc/Desktop/RHPC_2.0/ext/Boost/Boost_1.54/lib
BOOST_LIBS=-lboost_mpi-mt-s -lboost_serialization-mt-s -lboost_system-mt-s -lboost_filesystem-mt-s

恩,经过这样修改过后在我的电脑就可以用make RepastHPC_Demo_00命令完美编译链接出可执行文件了。

      总结:在运行命令不要照搬指南的命令,要结合自己的实际情况进行操作;

                 1.首先要注意自己的boost版本是否与repastHPC Tutorial上的boost版本是否相同,如果不同也不要紧,一定在编译的时候把相应的boost的路径设置正确

                 2.由于boost版本不同,所以对应的库文件名称也可能不同,所以库文件名称也需要改成自己电脑上相应的库文件名称

 =====================================我是分割线~\(≧▽≦)/~=============================

问题三

          其实这个问题跟前面的问题类似,在做第5步的时候Step 05: Repast Process,加入新的东西,此时编译又会出现前面的问题,我们这次直接修改env文件来达到目的,指南上所给的需要添加的内容如下:

REPAST_HPC_INCLUDE=-I/Users/murphy/ext/repasthpc_1.0.1/include/repast_hpc/
REPAST_HPC_LIB_DIR=-L/Users/murphy/ext/repasthpc_1.0.1/lib
REPAST_HPC_LIB=-lrepast_hpc-1.0.1

不用说也知道这样拷贝进去是不行滴,看看这上面的还是repasthpc1.0.1版本,我们现在使用的是2.0版本。所以必须要修改。正确运行的修改如下:

REPAST_HPC_INCLUDE=-I/home/repasthpc/Desktop/RHPC_2.0/include/repast_hpc/
REPAST_HPC_LIB_DIR=-L/home/repasthpc/Desktop/RHPC_2.0/lib/
REPAST_HPC_LIB=-lrepast_hpc-2.0

注意:我切换到/home/repasthpc/Desktop/RHPC_2.0/lib/目录下去看了看库文件,里面有两个库文件,分别为:

librelogo-2.0.a 和librepast_hpc-2.0.a,但是我们上面的REPAST_HPC_LIB=-lrepast_hpc-2.0却写的是repast_hpc-2.0,这是因为用“-l”的时候它会忽略“lib”和“.a”。如果我们写成REPAST_HPC_LIB=-llibrepast_hpc-2.0.a这样反而它会找不到。


====================================================我是分割线=======================

问题四:

          此步的问题完全就是RepastHPC Tutorial上的小错误,见第6步Step_06。第六步指南上的代码如下:

#include <stdio.h>
#include <boost/mpi.hpp>
#include "RepastProcess.h"


class RepastHPCDemoModel{
public:
	RepastHPCDemoModel(){}
	~RepastHPCDemoModel(){}
}

int main(int argc, char** argv){
	
	std::string configFile = argv[1]; // The name of the configuration file is Arg 1
	
	boost::mpi::environment env(argc, argv);
	boost::mpi::communicator world;

	repast::RepastProcess::init(configFile);
	
	repast::RepastProcess::instance()->done();
	
	RepastHPCDemoModel* model = new RepastHPCDemoModel();

	model->init();	

	delete model;
	
}
我照着敲进去运行出现错误,对比了下我没敲错,我还在想为啥又有错呢。然后看了文件中源码才发现,原来是这指南上的小错误,正确版本如下:

#include <stdio.h>
#include <boost/mpi.hpp>
#include "RepastProcess.h"


class RepastHPCDemoModel{
public:
	RepastHPCDemoModel(){}
	~RepastHPCDemoModel(){}
        void init(){}
};

int main(int argc, char** argv){
	
	std::string configFile = argv[1]; // The name of the configuration file is Arg 1
	
	boost::mpi::environment env(argc, argv);
	boost::mpi::communicator world;

	repast::RepastProcess::init(configFile);
	
	repast::RepastProcess::instance()->done();
	
	RepastHPCDemoModel* model = new RepastHPCDemoModel();

	model->init();	

	delete model;
	
}
指南中代码主要有两个问题:

        1.类的定义后没有分号;

        2.RepastHPCDemoModel类中并没有成员函数init()。


=================================我是分割线==========================================

问题五 Demo_00_step13

Step13

     里面的示例代码如下:

#include <stdio.h>
#include <boost/mpi.hpp>
#include "RepastProcess.h"
#include "Utilities.h"
#include "Properties.h"

class RepastHPCDemoModel{
	int stopAt;
public:
	RepastHPCDemoModel(std::string propsFile, int argc, char** argv,argc, argv, comm);
		stopAt = repast::strToInt(props.getProperty("stop.at"));
	}
	~RepastHPCDemoModel(){}
	void init(){}
	void doSomething(){
		std::cout << "Rank " << repast::RepastProcess::instance()->rank() << " is doing something." << std::endl;
	}
	void initSchedule(repast::ScheduleRunner& runner){
		runner.scheduleEvent(1, 1, repast::Schedule::FunctorPtr(new repast::MethodFunctor (this, &RepastHPCDemoModel::doSomething)));
		runner.scheduleStop(stopAt);
	}
};

int main(int argc, char** argv){
	
	std::string configFile = argv[1]; // The name of the configuration file is Arg 1
	std::string propsFile  = argv[2]; // The name of the properties file is Arg 2
	
	boost::mpi::environment env(argc, argv);
	boost::mpi::communicator world;

	repast::RepastProcess::init(configFile);
	
	repast::RepastProcess::instance()->done();
	
	RepastHPCDemoModel* model = new RepastHPCDemoModel(propsFile, argc, argv, &world);
	repast::ScheduleRunner& runner = repast::RepastProcess::instance()->getScheduleRunner();
	
	model->init();
	model->initSchedule(runner);
	
	runner.run();
	
	delete model;
	
}
这段代码也是有问题的,正确的代码如下:








  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值