具有同一库的冲突标头版本的依赖项

Dependencies with conflicting header versions of the same library

本文关键字:版本 依赖 冲突      更新时间:2023-10-16

我编译了一个使用tensorflow C api的简单程序,所以我将其链接到c_api.h标头和libtensorflow.so。它可以很好地编译并链接到program

当我用ldd program检查可执行文件的库依赖项时,我得到了直接依赖项及其位置:

linux-vdso.so.1 (0x00007ffc5bf4e000)
libtensorflow_framework.so.1 => /home/myuser/libtensorflow/lib/libtensorflow_framework.so.1 (0x00007fd35d341000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fd35f34a000)
(...other libraries...)

但是,当我运行该程序时,我收到此处描述的相同错误:

[libprotobuf FATAL external/protobuf/src/google/protobuf/stubs/common.cc:78] 
This program was compiled against version 2.6.1 of the Protocol Buffer runtime library, which is not compatible with the installed version (3.1.0). 
Contact the program author for an update. 
If you compiled the program yourself, make sure that your headers are from the same version of Protocol Buffers as your link-time library.

libprotobuf不在可执行文件的直接依赖项列表中,因此我假设它是一个子依赖项(即链接的库之一的依赖项(。

我的理解是,库dependency-that-uses-protobuf.so是使用libprotobuf.so.2.6.1文件编译的,而我的编译器使用了同一库但版本 3.1.0 的标头。这是对的吗?

如果是这样,我怎么能告诉链接器使用该特定库版本的标头而不是其他版本(使用 CMAKE(进行编译,从而防止运行时错误并获取链接器错误。(?)

我的困惑是因为到目前为止我只指定了作为可执行文件直接依赖项的链接库,所以我不知道如何(以及我是否应该(链接作为子依赖项的库。

我的解决方法是指定具有兼容 protobuf 版本的不同 OpenCV 路径:

# Finds installed opencv with incompatible Protobuff
# find_package( OpenCV REQUIRED ) 
# Finds the opencv with compatible Protobuf in my system
find_package( OpenCV REQUIRED PATHS /usr/local NO_DEFAULT_PATH)

解释

opencv 库和 tensorflow 库都是用静态链接到libprotobuf编译的,因此它们不会ldd命令一起显示。但是编译时仍然需要标头,并且两者都具有冲突的标头版本。