【发布时间】:2023-04-03 04:57:02
【问题描述】:
我编译了一个使用 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...)
但是,当我运行程序时,我得到了与here 描述的相同的错误:
[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),从而防止运行时错误并获得链接器错误。 (?)
我的困惑是因为到目前为止我只指定了作为可执行文件的直接依赖项的链接库,所以我不知道如何(如果我应该)链接作为子依赖项的库。
【问题讨论】:
-
"如果您自己编译程序,请确保您的 headers 来自与链接时库相同的 Protocol Buffers 版本。" - 您需要告诉编译器使用正确的包含目录。请注意,您使用的
libtensorflow_framework.so.1库本身可能构建不正确。 -
是的,但我的意思是在 CMAKE 中指定
find_package(LIB_PROTO protobuf PACKAGE_VERSION 2.6)之类的内容,然后(以某种方式)包含找到的库的包头文件夹。否则它不会与系统无关,而且我必须自己找到标题文件夹,这不是很有效率。此外,该库由 tensorflow 提供... -
如果你使用find_package,那么它支持
version参数。尝试使用它。 -
@Tsyvarev 事实证明,告诉链接器链接到某个 protobuf 版本是没有意义的,因为我的程序本身不依赖于库。相反,
libopencv_core.so和libtensorflow.so静态链接到不同版本的libprotobuf.so,CMAKE 必须找到要编译的库的头文件,但无论如何都会出错,因为找到的头文件会冲突 (请参阅下面的答案)。 唯一的解决方法是使用使用相同libprotobuf.so版本编译的 opencv 和 tensorflow 版本。
标签: c++ cmake linker dependencies