本文介绍 记录今天遇到的两个坑

记录今天遇到的两个坑

This article was original written by Jin Tian, welcome re-post, first come with https://jinfagang.github.io . but please keep this copyright info, thanks, any question could be asked via wechat: jintianiloveu

今天遭遇了两个坑,都是关于C++的。总结来说就几点:

  • 以后部署环境尽量,千万别,也没必要,不用,不需要自己从源码安装某个库。因为你无法保证别人编译安装的链接版本号就是一致的。相反,从apt统一安装是最好的方式;
  • boost从apt安装是没问题的,你caffe编译应该是没问题的;
  • linux这种的源码依赖方式说实话有时候问题很大,有时间得好好了解一下下一代操作系统以及操作系统编程语言,也就rust和fuchsia;

还有一个坑来自于ROS。

这个坑更大,源自于ros和libtorch的集成。事情是这样的。

我本想集成一个基于libtorch的程序进入ros,但是二者冲突,当我链接libtorch的时候,ros无法正确连接到对应的…. 库。当我把libtoch的链接库comment掉,一切正常。

可能的原因是我ros相关依赖真的没有,因为我卸载过一次boost,而这个卸载会把ros相关库一并卸载掉。那我tm就纳闷了,都TM卸载了,你怎么还能编译????

另外我在这种情况下,尽然可以编译出可执行程序,可我发现我tm连rosrun都没有,catkinmake你怎么做到的???


catkin_package(
        #  INCLUDE_DIRS include
        #  LIBRARIES semantic_seg
        #  CATKIN_DEPENDS other_catkin_pkg
        #  DEPENDS system_lib
)

这行代码没有什么用,但是在ros里面,如果 你不加它,那rosrun就无法找到执行脚本!!!! 无法找到!!太他妈的神奇的ros了

最后我发现一个很严重的问题:

  • C++各种依赖很头疼,但是习惯也还好;
  • 但是到了ROS,tm的起码复杂了1000倍!我认为替代C++应该先把ros这一套先干掉,太复杂了。

最后还有一个奇葩问题,我tm的窗口怎么只有关闭按钮了???

1561533004814

真的是。。。。。。

最终发现可能原因

https://discuss.pytorch.org/t/issues-linking-with-libtorch-c-11-abi/29510/2

来自pytorch论坛的论述:

So, it seems that I’ve found the issue. The TorchConfig.cmake has this piece of config:

if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
  set(TORCH_CXX_FLAGS "-D_GLIBCXX_USE_CXX11_ABI=0")
endif()
Which forces GCC to use the old C++11 ABI. Is there any reason why libtorch is being built using the old ABI ? Because what happens is that every single dependency that I have on my project such as leveldb or grpc for instance, won’t be able to be linked because they were compiled with the newer C++11 ABI. And I guess that this is the most common situation for other projects.

If I manually change GLIBCXX_USE_CXX11_ABI=1 and recompile the entire libtorch by myself, it works just fine, but that requires a lot of manual steps that aren’t quite easy to integrate into my CMake file. Not to mention that it’s really hard to figure out how to compile the libtorch correctly.

Are there any plans to move to the newer C++11 ABI and thus allow other dependencies to be linked without problems ? Otherwise, people will have a lot of trouble to depend on the libtorch libraries.

这句话什么意思呢?也就说libtorch默认使用了比较老的版本的ABI,而我们的ros或者其他很多程序都用的新的ABI。他妈的这就导致了这个玩意跟其他任何库都可能无法一起编译!!

这个人解释了为什么pytorch要用老的ABI编译:

1561534490010

这个是啥意思呢?他们用的是gcc4.9,而这个只能使用老的ABI,他们的理由就是低版本的高版本也能用,但是高版本的低版本是用不了的。

沃日,真tm的坑。这群facebook的程序员。

坑在继续.

感觉tm的ros跟libtorch是冤家对头啊!!

你libtorch用低版本的编译的对吧?那么我在cmake里面去掉高版本的ABI可以吧?兼容你的低版本:

add_compile_options(-std=c++11 -D_GLIBCXX_USE_CXX11_ABI=0)

可是问题是!!!!这个加入之后,他妈的,ros就无法执行了。ros不支持降低ABI。。。。。。。

我也是无语了。

最后是从源码编译pytorch。不过请注意,从源码编译的时候千万不要直接从master分支,会踩坑。

切换到v1.1.0分支,可以从源码编译,完了之后把我们需要的链接库替换掉即可。