CMake 链接错误(未定义的引用)

2024-03-31

我正在使用 SSL-Vision 软件。它有一个示例客户端,我一直试图将其与整个项目分开。我找到了自己编辑客户端所需的源代码,因此我只是从软件中复制它们并使用 CMake 来构建我的客户端。

下面的项目结构经过简化,缩小了问题范围(我相信!)。

.
├── CMakeLists.txt 
├── main.cc
├── build
│   ├── CMakeLists.txt
│   └── messages_ssl_... (.cc/.h, 4 each)
└── src
    ├── CMakeLists.txt
    └── (Other subdirs and sources/headers) 

./CMakeLists.txt:

cmake_minimum_required(VERSION 2.6)
project( TestClient )

find_package( PkgConfig REQUIRED )
pkg_check_modules( QTCORE_PKG QtCore )
include_directories( ${QTCORE_PKG_INCLUDE_DIRS} )

include(FindProtobuf)
find_package( Protobuf REQUIRED )
include_directories( ${PROTOBUF_INCLUDE_DIRS} )

find_package( PkgConfig REQUIRED )
pkg_check_modules( GLIB_PKG glib-2.0 ) 
include_directories( ${GLIB_PKG_INCLUDE_DIRS} )

include_directories( "src" ) 
add_subdirectory( src )

include_directories( "build" ) 
add_subdirectory( build )


add_executable( clientTest clientTest.cc )

target_link_libraries( clientTest robocup_ssl_client messages_robocup_ssl_detection.pb messages_robocup_ssl_geometry.pb messages_robocup_ssl_wrapper.pb messages_robocup_ssl_refbox_log.pb netraw robocup_ssl_client protobuf QtCore )

./build/CMakeLists.txt:

add_library( messages_robocup_ssl_detection.pb SHARED messages_robocup_ssl_detection.pb.cc )

add_library( messages_robocup_ssl_refbox_log.pb SHARED messages_robocup_ssl_refbox_log.pb.cc )

add_library( messages_robocup_ssl_geometry.pb SHARED messages_robocup_ssl_geometry.pb.cc )

add_library( messages_robocup_ssl_wrapper.pb SHARED messages_robocup_ssl_wrapper.pb.cc )

可能是缺失的#include in the messages_ssl_...文件,但它们都是自动生成的并且似乎是正确的。

In messages_robocup_ssl_detection.pb.h and messages_robocup_ssl_detection.pb.h仅包含 protobuf。

In messages_robocup_ssl_refbox_log.pb.h:

#include "messages_robocup_ssl_detection.pb.h"
// Other protobuf includes

In messages_robocup_ssl_wrapper.h:

#include "messages_robocup_ssl_detection.pb.h"
#include "messages_robocup_ssl_geometry.pb.h"
// Other protobuf includes

每个 .cc 文件中仅包含其标头和其他 protobuf 库。

最后,当我执行 make 时,会生成以下错误:

Linking CXX executable clientTest
build/libmessages_robocup_ssl_wrapper.pb.so: undefined reference to `SSL_GeometryData::ByteSize() const'
build/libmessages_robocup_ssl_wrapper.pb.so: undefined reference to `SSL_GeometryData::MergeFrom(SSL_GeometryData const&)'
build/libmessages_robocup_ssl_wrapper.pb.so: undefined reference to `protobuf_AddDesc_messages_5frobocup_5fssl_5fgeometry_2eproto()'
build/libmessages_robocup_ssl_wrapper.pb.so: undefined reference to `SSL_GeometryData::Clear()'
build/libmessages_robocup_ssl_wrapper.pb.so: undefined reference to `SSL_GeometryData::SSL_GeometryData()'
build/libmessages_robocup_ssl_wrapper.pb.so: undefined reference to `SSL_GeometryData::default_instance()'
build/libmessages_robocup_ssl_wrapper.pb.so: undefined reference to `SSL_GeometryData::SerializeWithCachedSizesToArray(unsigned char*) const'
build/libmessages_robocup_ssl_wrapper.pb.so: undefined reference to `SSL_GeometryData::MergePartialFromCodedStream(google::protobuf::io::CodedInputStream*)'
collect2: ld returned 1 exit status
make[2]: ** [clientTest] Erro 1
make[1]: ** [CMakeFiles/clientTest.dir/all] Erro 2
make: ** [all] Erro 2

一段时间以来我一直在尝试解决这个问题。 为什么是libmessages_robocup_ssl_wrapper.pb.so如果在链接之前已经构建,则显示错误?


这很可能是链接顺序。

看起来像messages_robocup_ssl_wrapper.pb依赖于取决于messages_robocup_ssl_geometry.pb。如果是这样,包装应该来before连接线中的几何形状。

target_link_libraries( clientTest robocup_ssl_client
                       messages_robocup_ssl_detection.pb
                       messages_robocup_ssl_wrapper.pb
                       messages_robocup_ssl_geometry.pb
                       messages_robocup_ssl_refbox_log.pb
                       netraw
                       robocup_ssl_client
                       protobuf
                       QtCore )

更好的是,让 CMake 来处理这样的依赖关系。

如果你添加...

target_link_libraries( messages_robocup_ssl_wrapper.pb
                       messages_robocup_ssl_geometry.pb )

那么 CMake 将自动保留该依赖关系messages_robocup_ssl_wrapper.pb被指定为另一个目标的依赖项。如果您这样做,那么您可以选择省略messages_robocup_ssl_geometry.pb来自target_link_libraries( clientTest ... ) call.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CMake 链接错误(未定义的引用) 的相关文章

  • 使用cmake创建UWP包

    我正在开发简单的 hello world 应用程序 main cpp include
  • CMake:如何在多个文件上运行自定义命令来生成源文件?

    我有以下情况 我想编译一些Scheme文件Gambit https github com gambit gambit成可执行文件 为此 我使用 gambit 将所有计划文件翻译 生成为 C 和目标文件 然后将其编译并链接为可执行文件 假设我
  • 如果构建是源代码外的,CMake 无法找出标头依赖项?

    我一直在使用 CMake 来管理一个单独的小型 c 项目 基于 Unix Makefile 并决定将其转换为更有组织的源代码外构建 但是 当它超出源时 通过执行cmake 在 build 中 我的标头不再是其源文件的依赖项 如果我只是从顶层
  • 如何将我的 C 代码与 PCRE 库链接? (当前抛出链接器错误。)

    问题 Note 我最初在一个更大的项目中遇到了这个问题 所以我将代码缩减为您在下面看到的测试用例 我不知道如何编译以下测试代码 具体来说 链接器似乎无法找到 PCRE 库 有关 PCRE 的配置方式 请参阅下文 尽管有明确的 L usr l
  • CMake 链接失败

    我正在为 CMake 配置我的项目 并且遇到链接问题 项目文件全部编译成功 然后它说它正在链接并报告未找到的各种符号 这些符号大部分是由我自己的代码提供的 其中一些是由 BerkeleyDB 提供的 它已被正确定位并包含在内 这是我的顶级
  • CMake 错误:无法创建命名生成器 Visual Studio 15 2017 Win64-T

    我想建立这个项目 https github com xmrig xmrig https github com xmrig xmrig根据此处的说明 https github com xmrig xmrig wiki Windows Buil
  • 使用 cmake 和 Visual Studio 的一个解决方案中的多个项目

    我有一个 Visual Studio 2010 解决方案 其中包含 5 个项目 两个库和三个应用程序 依赖于库 我现在想将构建系统迁移到 CMake 也能够在 Linux 下编译 我已经了解了如何为一个项目编写 CMakeLists txt
  • CMake错误:本项目中使用了以下变量,但它们被设置为NOTFOUND

    我正在尝试配置whalebot带有 tar 文件的爬虫whalebot 0 02 00 tar gz 我已正确提取它 root Admin1 dls tar xvzf whalebot 0 02 00 tar gz 之后我想对其进行配置 r
  • CMake 64 位和 SFML 64 位

    我正在尝试使用适用于 Windows 的 CMake 64 位和 SFML 2 5 1 64 位构建 C 项目 当我在项目上运行 cmake 时 我收到一条错误消息 我能让它工作的唯一方法是改变CMAKE PREFIX PATH指向 SFM
  • 如何重新安装最新的cmake版本?

    我想在Linux环境下安装cmake的最新版本 我安装了 cmake 3 5 版 但某些应用程序不支持 我尝试通过卸载当前版本来升级它 但是当我使用 sudo apt get install cmake 重新安装时 我重新安装了相同的版本
  • 如何安装和使用 YAML-Cpp

    我想学习 YAML 并将其与 C 一起使用 但我一直在尝试设置YAML Cpp 让我解释一下到目前为止我所做的事情 我下载了源代码 版本0 5 1 安装的 Cmake 适用于 Windows 安装了 Boost 库 为 Visual Stu
  • 在cmake中检测项目语言

    我想检测当前的项目语言 例如 如果我有这样的东西 cmake minimum required VERSION 3 0 project foo VERSION 1 0 LANGUAGES CXX 我需要这样的东西 if project la
  • CMake:不要为链接中使用的单个库设置 rpath

    我想要做的是配置我的 CMakeLists 文件 以便在构建我的项目时 链接器使用驻留在我的构建树中的共享库 so 的副本来链接可执行文件 但不会在中设置 rpath链接的可执行文件 以便系统必须在加载程序请求时提供该库 具体来说 我想在构
  • 如何在 Windows 中使用 cmake 更轻松地链接 gtk 库?

    我现在通过手动包含所有必需的路径 gtk包位于D Tools gtk bundle 2 20 0 20100406 win32 include directories D Tools gtk bundle 2 20 0 20100406 w
  • 如何将脚本的依赖项添加到 CMake 中的目标?

    链接我的程序后 我需要对其执行一些后处理 我添加了一个add custom command TARGET 效果很好 但是 这个额外的自定义命令运行一个脚本 未生成 它已签入代码库 并且我希望如果该脚本发生更改 目标将被视为过时 以便正确重建
  • wasm-ld:错误:初始内存太小,需要 18317952 字节

    我想将 ffmpeg 编译为 wasm 下载 FFMPEG 和 emsdk 源代码后 我使用下面的命令进行构建 emconfigure configure cc emcc enable cross compile target os non
  • cmake 不会在更改时重建 externalProject

    我有以下 CMakeLists txt cmake minimum required VERSION 3 0 project addProject include ExternalProject set ExternalProjectCMa
  • 在 Android Studio 中使用预构建的共享库

    我需要在我的 android 项目中使用自定义的预构建共享库 在独立 ndk 上构建为 libdynamic so 我在路径 src main 中创建了一个文件夹 jniLibs 然后在其中创建了 4 个文件夹 即 armeabi arme
  • RestKit链接器错误

    我一直遵循 RestKit 安装说明 但现在在尝试构建应用程序时出现错误 这是针对 ios iPad 的 我收到 命令 Developer Platforms iPhoneSimulator platform Developer usr b
  • CMake Xcode生成器创建了一个无法构建的项目

    我有一个使用 CMake 构建系统的 C 项目 我使用 MacBook Pro 进行开发 因此当我使用终端时 一切都非常顺利 我可以构建我的项目 然而 今天我发现我可以在使用 CMake 生成器创建相应的项目后使用 Xcode gt cma

随机推荐

  • 在 Python 中嵌套函数会产生开销吗?

    在Python中 如果我在父函数中有一个子函数 那么每次调用父函数时子函数是否都会 初始化 创建 将一个函数嵌套在另一个函数中是否会产生任何性能开销 代码对象是预编译的 因此该部分没有开销 函数对象在每次调用时构建 它将函数名称绑定到代码对
  • 在 WPF 中仅画刷椭圆的部分

    我无法找到绘制以下形状的最佳方法 我正在使用下面的代码来绘制Ellipse在视觉层上 但我怎么可能只刷宿舍呢 我认为可以使用LinearGradientBrush or RadialGradientBrush但我不知道如何使用它 var c
  • ActiveMQ NMS:当代理关闭时,connection.start() 会因故障转移协议而挂起

    我有使用 nms activemq 1 5 0 的 C 应用程序 当我的应用程序启动时 它尝试使用故障转移协议连接到代理 我有两个主从配置的代理 如果两个经纪人都关闭了 我的应用程序就会因为以下原因而陷入等待状态 connection st
  • 流行的源代码控制系统如何区分二进制文件和文本文件

    寻找有关不同源代码控制系统如何区分 或检测 文件类型 二进制与文本 的文章 文档或直观知识 特别令人感兴趣的是 Git 与 Mercurial 相比是如何做到这一点的 他们是否看 文件扩展名 文件签名或内容 即该文件是否为 UTF8 各种东
  • 这个C++宏的含义是什么?

    我不明白这个宏的含义 define DECLARE HANDLE n typedef struct n int i n DECLARE HANDLE HWND 我从中学到了C程序 表示连接参数 所以宏等于 typedef struct HW
  • Silverlight 和 C++ 或 C++ 到 C# 正在进行代码转换吗?

    我正在开发一款基于绘图的产品 我希望按照优先级顺序为 iPhone 桌面 OS X Windows 平板电脑 基于 Silveright 的浏览器 Windows Mobile 和 Windows 生成版本 对于 GUI 可移植性 经典的答
  • AVG 将我的程序检测为病毒。这是怎么回事? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions AVG表示 从下面的代码编译出来的可
  • 使用保留的包名称访问包私有变量

    我正在研究源代码java util HashMap http www java2s com Open Source Java Document 6 0 JDK Core Collections Jar Zip Logging regex j
  • 查看 iOS 中的内存使用情况

    有什么办法可以知道iOS有多少可用内存吗 我知道当可用内存变低时 系统会发出低内存警告 然而 我的应用程序有一些点 单个线程将执行复杂的任务 有时该任务会占用足够的内存 以至于它被操作系统终止 我的应用程序可以从互联网下载图片 我将它们缩小
  • 获取 C 中编译时表达式的值

    有没有办法让 C 编译器 在我的例子中是 XC16 它基于 gcc 转储编译时表达式的结果 我们有很多 define 比如 define FOO 37 6 define FOO BASE 0 035 define FOO FIXEDPOIN
  • 在 UWP 中使用滑动手势

    我已经看到 自最新更新 Windows Fall Creators Update 以来 存在一系列 Swipe 类 但在当前稳定版本的 VS 15 4 1 中 没有办法让它工作 我目前正在使用 Visual Studio 2017 Ente
  • 寻找共同块

    我有两个文件 f1 和 f2 其中包含一些文本 或二进制数据 如何快速找到共同的区块 e g f1 ABC 防御f2 XXABC XEF output 常见块 长度 4 f1 0 和 f2 2 中的 ABC 长度 2 f1 5 和 f2 8
  • 将数组转换为函数参数列表[重复]

    这个问题在这里已经有答案了 是否可以将 JavaScript 中的数组转换为函数参数序列 例子 run render 10 20 200 200 function run calls var app app is retrieved fro
  • 如何获取 DB2 MQT 上次刷新时间

    对于 z OS 上的 DB2 物化查询表 如何检索上次刷新时间 文档指出 http www 01 ibm com support knowledgecenter SSEPEK 10 0 0 com ibm db2z10 doc perf s
  • Windows 8.1 上的 Pyusb - 没有可用的后端 - 如何安装 libusb?

    使用 pyinstaller 3 1 python 2 7 9 和 tkinter 尝试使用 pyusb 而不是 pyserial 但没有可用的后端 调查Windows 上的 Pyusb 没有可用的后端 https stackoverflo
  • 给子例程别名时出现“...仅使用一次:可能的拼写错误”警告

    我有一些模块 想为一些子模块创建别名 这是代码 usr bin perl package MySub use strict use warnings sub new my class shift my params shift my sel
  • 如何在 Stata 中聚合关系数据?

    我无法解决以下 Stata 编程问题 我有一个表格 列出了客户购买的所有汽车并进行 Customer Make Price c1 m1 1 c1 m1 2 c1 m3 1 c2 m2 2 c3 我想将其转换为每个客户一个观察 行的表格 列出
  • 如何使用.NET框架将上传到服务器的不带.json扩展名的文件设置为内​​容类型“application/json”

    我一直在尝试在 iOS9 上为我们的 iOS 应用程序设置深度链接 第一步涉及创建一个 JSON 文件 我已经这样做了 然后将其上传到服务器 我遇到的问题是我已将 json 文件上传到服务器的位置 https www example com
  • 编写类似于程序集缓存查看器的 Windows Shell 扩展

    我想编写一个 shell 扩展来完全自定义特定文件夹的显示 以及程序集缓存查看器 浏览到 c windows assembly 您就会明白我的意思 哪些 COM 接口负责提供这些钩子 我的 查看器 将用 C 编写 Thanks 请注意 有关
  • CMake 链接错误(未定义的引用)

    我正在使用 SSL Vision 软件 它有一个示例客户端 我一直试图将其与整个项目分开 我找到了自己编辑客户端所需的源代码 因此我只是从软件中复制它们并使用 CMake 来构建我的客户端 下面的项目结构经过简化 缩小了问题范围 我相信 C