我正在尝试使用对protobuffers 3.4.1和2.6.1的引用来编译单个代码库。现在2.6.1变体已被全局定义为我正在使用ubuntu xenial,也:
$ protoc --version
产量:
libprotoc 2.6.1
对protobuffer版本3.4.1的要求来自Google Cartographer(https://github.com/googlecartographer/cartographer),而对2.6.1的要求来自转子模拟器(https://github.com/ethz-asl/rotors_simulator),因为它依赖于Gazebo-7(它使用protobuffer 2.6.1)。为了编译Google Cartographer,我通过添加以下几行来适应Google Cartographer的CMakeList.txt(请参见此处原始文件:https://raw.githubusercontent.com/googlecartographer/cartographer/master/CMakeLists.txt),从而将二进制文件(添加到proto3文件夹中,请参见下文)添加到安装中:
set(CMAKE_PREFIX_PATH CMAKE_PREFIX_PATH "${CMAKE_SOURCE_DIR}/proto3")
...
install(DIRECTORY proto3/ DESTINATION .)
因此,protobuffer 3.4.1的二进制文件已添加到安装文件夹。我正在使用catkin-tools(https://catkin-tools.readthedocs.io/en/latest/)构建整个工作区。现在,在用于转子模拟器的CMakelist.txt中,我有以下一行:
find_package(Protobuf 2.6.1 REQUIRED HINTS "/usr")
但是目前在尝试编译时,它似乎无法找到protobuffer 2.4.1,因为它返回以下内容:
Could not find a configuration file for package "Protobuf" that is
compatible with requested version "2.6.1".
The following configuration files were considered but not accepted:
/home/jochem/catkin_ws/install/lib/cmake/protobuf/protobuf-config.cmake,
version: 3.4.1
附带说明一下,如果我分别编译软件包,则可以编译和安装软件包。这是通过以下命令完成的:
catkin build cartographer_ros
和
catkin build rotors_gazebo_plugins
我目前正在尝试调整rotors_gazebo_plugins的程序包,但到目前为止无法确保选择了正确的protobuffer库,我是否通过定义对本地protobuffer版本的引用而丢失了某些内容?
最佳答案
您会发现可以构建一个可执行文件,该可执行文件在Mac上引用同一库的2个版本,在Windows上非常困难,而在Unix上几乎是不可能的。这是因为符号名称在两个库之间没有区别,因此,如果您同时加载两个库,则无法知道哪个库应该为哪个调用服务。
如果要在一个makefile包中构建2个不同的可执行文件,则只需设置正确的库即可在链接阶段加载。在linux中,通常在系统上安装带版本号后缀的库,以及一个发布不带版本号的最新版本的符号链接(symbolic link)。通常,您只需链接到未添加后缀的最新版本,但是在这种情况下,在链接命令中,您将需要显式添加后缀。
如果确实需要将这个卵石链接到一个可执行文件中,那么在Unix上,您可以使用objcopy --redefine-syms
进行很多操作,以重命名其中一个库中的所有入口点,以及所有相关代码中的引用都在编译后但在链接。请注意,预期的最终结果是两个库将独立运行,并且不会相互了解。