我正在尝试编译一个引用了protobuffers 3.4.1和2.6.1的代码库。现在2.6.1版本是全局定义的,因为我使用的是ubuntu xenial,也是:
$ protoc --version收益率:
libprotoc 2.6.1protobuffer版本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,我添加了以下几行代码,将二进制文件(添加到proto3文件夹中,如下所示)添加到安装中,方法是修改Google Cartographer的CMakeList.txt (请参阅此处的原始文件:https://raw.githubusercontent.com/googlecartographer/cartographer/master/CMakeLists.txt):
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版本的引用而错过了什么?
发布于 2018-06-07 00:11:34
你会发现在mac上构建一个引用同一个库的两个版本的可执行文件是可能的,在windows上相当困难,在unix上几乎不可能。这是因为两个库之间的符号名称不同,所以如果加载这两个库,就无法知道哪个库应该为哪个调用提供服务。
如果你要在一个makefile包中构建两个不同的可执行文件,那么你只需要设置正确的库在链接阶段加载即可。在linux中,库通常安装在您的系统上,带有版本号后缀和一个符号链接,用于发布不带版本号的最新版本。通常,您只需链接到无后缀的最新版本,但在您的情况下,在您的link命令中,您需要显式地添加后缀。
如果您确实需要将这些拼凑在一起的代码链接到一个可执行文件中,那么在unix上,您可以使用objcopy --redefine-syms做很多事情来重命名其中一个库中的所有入口点,以及依赖代码中的所有引用,这些都是在编译之后,但在链接之前。请注意,预期的最终结果是两个库将独立运行,并且不会相互识别。
发布于 2018-06-07 00:23:42
如果您能够将至少一个库(即绘图器或旋转器或两者)包装到一个单独的共享库中,并且如果协议缓冲区仅在它们中的每一个中内部使用,那么您仍然可以通过使用-fvisibility=hidden gcc标志构建共享库(以切换默认可见性以隐藏符号),并仅通过__attribute__((visibility("default")))导出所需的符号(即应用程序正在使用的符号),从而在单个可执行文件中同时使用它们。
通过这种方式,我回忆起过去我能够在同一个应用程序中使用两个完全不同的Boost版本(通过共享库不导出静态链接的boost符号)。
https://stackoverflow.com/questions/50724782
复制相似问题