同样是在TUM的Van-pooling项目中,项目中有多个.cpp
文件,因为需要将他们统一到同一个.dll
文件中以便在python中导入并调用其中的函数。另外,其实各个.cpp
文件之间是相互关联的,所以说将它们分别单独导入也是无益的,因为那样没办法实现它们的功能。
1. 文件列表:
-
common.h
: 供common.cpp
,simulation.cpp
和main.cpp
使用的头文件; -
common.cpp
: 里面定义了构建路网的函数road_load()
; -
simulation.h
: 供simulation.cpp
和main.cpp
使用的头文件; -
simulation.cpp
: 里面有实现scheduler功能的函数handle_event()
; -
main.cpp
: 主函数
2. 失败的初次尝试
刚开始是尝试着利用common.cpp
和simulation.cpp
这两个文件分别生成两个静态链接库.lib
文件,然后再在main.cpp
中调用这两个文件,最后利用main.cpp
转化出一个动态库.dll
文件。结果就是一直失败,错误信息:
undefined reference to road_load()
大概是这样。原因去找过,但是毕竟不是科班,也没必要去了解太多,大概就是因为动态库连接不上那两个静态库。多次尝试解决无果之后,便作罢,因为那一天就已经结束了。而且当天下午开了个skype会议,然后我看出来带我的那个博士Moeid已经处于有点焦虑的状态了。倒不是我的问题,其实他之前给我的任务我都完成了。这个项目是个既“跨国”又跨平台的项目,“跨国”只是说是两个不同学校之间合作的项目,而跨平台则是因为合作院校那边的负责人用C++
开发Scheduler,而TUM则利用SUMO的TraCI在Python
上搭建Demand Enhancement Model。不好说太多细节,反正就是麻烦得很。焦虑的源头是因为他们已经在Python
和C++
的交互问题上浪费了三个月的时间,而导致Moeid这边的研究没办法继续,因为他的后续研究依赖Scheduler返回的结果。所以Moeid向我表示了忧虑,他说他没办法向Prof. Constantinos交代这一个月的工作,“我总不能告诉他我这个月又什么都没做吧?”。所以在周三的时候(22/5/2019),我给他打包票说,放心,我周五给你个答复。
3. 其实很简单
果然,这种事情如果交给学C++
的人来做的话根本就不会是一个问题,但是交给像我这样的外行人来说,真的就是很费时间,或者说完全是在浪费时间。果然,还是应该像阿坤说的那样,应该好好去推公式的好。但是呢,我有转念一想了,如果我把这一条C++
和Python
(SUMO)这条路打通了,那我以后可能就是在用SUMO的人里面唯一能够利用C++
来加快自己算法的人,所以...或许,只是或许并不是件坏事。这样一安慰自己也就好了。转回正题,解决方案如下:(直接把交给Moeid的简单的工作报告的一部分给复制上来了,懒得再写了)
The steps are listed below, and the first three commands have the same function, that is creating a .o
file depends on a '.cpp' file. And the last command is generating a .dll
file by linking the three .o
file generated in the last three steps.
- g++ -o common.o -c common.cpp
- g++ -o simulation.o -c simulation.cpp
- g++ -o main.o -c main.cpp
- g++ -shared -fPIC -o sche.dll common.o simulation.o main.o