如何将多个库集合到同一个动态链接库中

同样是在TUM的Van-pooling项目中,项目中有多个.cpp文件,因为需要将他们统一到同一个.dll文件中以便在python中导入并调用其中的函数。另外,其实各个.cpp文件之间是相互关联的,所以说将它们分别单独导入也是无益的,因为那样没办法实现它们的功能。

1. 文件列表:

  • common.h: 供common.cppsimulation.cppmain.cpp使用的头文件;
  • common.cpp: 里面定义了构建路网的函数road_load()
  • simulation.h: 供simulation.cppmain.cpp使用的头文件;
  • simulation.cpp: 里面有实现scheduler功能的函数handle_event()
  • main.cpp: 主函数

2. 失败的初次尝试

刚开始是尝试着利用common.cppsimulation.cpp这两个文件分别生成两个静态链接库.lib文件,然后再在main.cpp中调用这两个文件,最后利用main.cpp转化出一个动态库.dll文件。结果就是一直失败,错误信息:

undefined reference to road_load()

大概是这样。原因去找过,但是毕竟不是科班,也没必要去了解太多,大概就是因为动态库连接不上那两个静态库。多次尝试解决无果之后,便作罢,因为那一天就已经结束了。而且当天下午开了个skype会议,然后我看出来带我的那个博士Moeid已经处于有点焦虑的状态了。倒不是我的问题,其实他之前给我的任务我都完成了。这个项目是个既“跨国”又跨平台的项目,“跨国”只是说是两个不同学校之间合作的项目,而跨平台则是因为合作院校那边的负责人用C++开发Scheduler,而TUM则利用SUMO的TraCI在Python上搭建Demand Enhancement Model。不好说太多细节,反正就是麻烦得很。焦虑的源头是因为他们已经在PythonC++的交互问题上浪费了三个月的时间,而导致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

你可能感兴趣的:(如何将多个库集合到同一个动态链接库中)