CMake“uuid”链接失败

Posted

技术标签:

【中文标题】CMake“uuid”链接失败【英文标题】:CMake "uuid" linking FAIL 【发布时间】:2016-08-21 19:15:01 【问题描述】:

在尝试构建时出现此错误:

对“uuid_generate”的未定义引用

对“uuid_unparse”的未定义引用

这是我的 CMakeLists.txt 文件:

cmake_minimum_required(VERSION 3.6)
project(Synergy)

set(CMAKE_CXX_FLAGS "$CMAKE_CXX_FLAGS -std=c++11 -luuid -pthread")
find_package (Threads)

set(SOURCE_FILES Functions.cpp Inotify.cpp Inotify.h main.cpp Master.h Message.cpp Message.h Server.cpp Server.h Threads.cpp )
add_executable(synergy_server $SOURCE_FILES)

我可以通过自己创建Makefile并添加-luuid标志来解决这个问题。

但我想用 CMake 来做,我试图在 CMakeLists.txt 文件中添加这个标志,但它没有帮助:(

我已经安装了 uuid-dev(不是问题)

希望你能帮助我。

祝你有美好的一天

编辑: 我将target_link_libraries(Synergy uuid) 添加到文件末尾并且它可以工作,但是有更好的方法(查看下面的答案)

【问题讨论】:

CMake link to external library的可能重复 您的问题几乎是所有 CMake 教程的一部分。您的实际问题更为笼统。 “如何使用 CMake 链接外部库” 你说得对,我是堆栈溢出的新手,所以我还在学习。下次我会更一般。但问题是我尝试添加外部库但它不起作用。 【参考方案1】:

这不是编写 CMake 脚本的好方法。 CMake 带有一组丰富的功能,您必须使用这些功能来描述您想要做什么。

在你的情况下,你必须避免像你所做的那样直接设置标志。这样,您将能够更改编译器甚至操作系统,并且您的脚本仍然可以工作。

在你的情况下,我会这样写:

cmake_minimum_required(VERSION 3.6)
project(Synergy)

set(CMAKE_CXX_STANDARD 11)

# using pkg-config to configure uuid
find_package(PkgConfig REQUIRED)
find_package(Threads REQUIRED)

pkg_search_module(UUID REQUIRED uuid)

set(SOURCE_FILES Functions.cpp Inotify.cpp Inotify.h main.cpp Master.h message.cpp Message.h Server.cpp Server.h Threads.cpp )
add_executable(synergy_server $SOURCE_FILES)
target_include_directories(synergy_server PUBLIC $UUID_INCLUDE_DIRS)
target_link_libraries(synergy_server $UUID_LIBRARIES $CMAKE_THREAD_LIBS_INIT)

对了,uuid-dev是什么意思?我的系统里没有这样的东西

【讨论】:

uuid-dev是uuid的开发包,即uuid的headers。也许您的发行版没有将此库拆分为开发和库包。 我的 cmake 文件由 Clion 创建,我会尝试使用你的文件,我会告诉你它是否适合我 "PkgConfig" 未找到! -- 跨平台的就这么多。

以上是关于CMake“uuid”链接失败的主要内容,如果未能解决你的问题,请参考以下文章

GLEW + cmake 链接失败“未定义对符号 glDrawElements 的引用”+“命令行中缺少 DSO”

cmake build dir 存储在 ramdisk 中并符号链接到项目导致 make 失败

在 CodeBlocks 中链接 OpenCV 库失败?

mysql主从复制失败(uuid)

CMake编译OpenCV-3.2.0源码,使其可以在VS2013下进行图像处理开发的失败过程记录

扩展存在但 uuid_generate_v4 失败