Cmake target_link_libraries 未链接我的库

2024-02-26

我将开始声明我在 Cmake 问题上几乎完全愚蠢。

我有以下内容CMakeLists.txt对于 Kdevelop 4.1 项目:

project(uart)

find_package(KDE4 REQUIRED)
include (KDE4Defaults)

include_directories( ${KDE4_INCLUDES} ${QT_INCLUDES} src/include src/include/QSerialDevce )

add_subdirectory(doc)
add_subdirectory(src)
add_subdirectory(icons)

link_directories(/usr/lib)

find_library(SERIALDEVICE_LIB qserialdeviced)

add_executable(uart ${uart_SRCS})
target_link_libraries(uart ${SERIALDEVICE_LIB})

当我尝试构建我的项目时,我看到:

uart/build> make -j2
-- Found Qt-Version 4.6.3 (using /usr/bin/qmake-qt4)
-- Found X11: /usr/lib64/libX11.so
-- Found KDE 4.5 include dir: /usr/include/kde4
-- Found KDE 4.5 library dir: /usr/lib64/kde4/devel
-- Found the KDE4 kconfig_compiler4 preprocessor: /usr/bin/kconfig_compiler4
-- Found automoc4: /usr/bin/automoc4
CMake Error at CMakeLists.txt:16 (add_executable):
  add_executable called with incorrect number of arguments


CMake Error: Attempt to add link library "/usr/lib/libqserialdeviced.so" to target "uart" which is not built by this project.
-- Configuring incomplete, errors occurred!
make: *** [cmake_check_build_system] Error 1
*** Failed ***

我读到的一切都表明add_executable and target_link_libraries应该类似于我文件的最后两行:

add_executable(uart ${uart_SRCS})
target_link_libraries(uart ${SERIALDEVICE_LIB})

如果我改变这两行CMakeLists.txt将其保留为:

project(uart)

find_package(KDE4 REQUIRED)
include (KDE4Defaults)

include_directories( ${KDE4_INCLUDES} ${QT_INCLUDES} src/include src/include/QSerialDevce )

add_subdirectory(doc)
add_subdirectory(src)
add_subdirectory(icons)

link_directories(/usr/lib)

find_library(SERIALDEVICE_LIB qserialdeviced)

target_link_libraries(${SERIALDEVICE_LIB})

I see:

uart/build> make -j2
-- Found Qt-Version 4.6.3 (using /usr/bin/qmake-qt4)
-- Found X11: /usr/lib64/libX11.so
-- Found KDE 4.5 include dir: /usr/include/kde4
-- Found KDE 4.5 library dir: /usr/lib64/kde4/devel
-- Found the KDE4 kconfig_compiler4 preprocessor: /usr/bin/kconfig_compiler4
-- Found automoc4: /usr/bin/automoc4
-- Configuring done
-- Generating done
-- Build files have been written to: uart/build
[ 11%] Built target doc-handbook
[ 11%] Built target uart_automoc
Linking CXX executable uart
CMakeFiles/uart.dir/uart.o: In function `uart::setupSerial()':
uart/src/uart.cpp:126: undefined reference to `AbstractSerial::AbstractSerial(QObject*)'
CMakeFiles/uart.dir/uart.o: In function `uart::setupEnumerator()':
uart/src/uart.cpp:108: undefined reference to `SerialDeviceEnumerator::SerialDeviceEnumerator(QObject*)'
CMakeFiles/uart.dir/uart.o: In function `uart::setupSerial()':
uart_/uart/src/uart.cpp:136: undefined reference to `AbstractSerial::enableEmitStatus(bool)'
CMakeFiles/uart.dir/uart.o: In function `uart::setupEnumerator()':
uart_/uart/src/uart.cpp:112: undefined reference to `SerialDeviceEnumerator::setEnabled(bool)'
collect2: ld returned 1 exit status
make[2]: *** [src/uart] Error 1
make[1]: *** [src/CMakeFiles/uart.dir/all] Error 2
make: *** [all] Error 2
*** Failed ***

这清楚地表明target_link_libraries没有链接我的qserialdeviced.

qserialdeviced is at /usr/lib/libqserialdeviced.so.1.0.0,正确地模拟链接到/usr/lib/libqserialdeviced.so如果我手动将其添加到 Makefile 中,很容易找到。

我显然尝试过:

target_link_libraries(-lqserialdeviced)

没有任何变化。

我也尝试过:

if ("${SERIALDEVICE_LIB}" STREQUAL "SERIALDEVICE_LIB-NOTFOUND")
    message(FATAL_ERROR "'qserialdeviced' wasn't found!")
else()
    message("'qserialdeviced' found: " ${SERIALDEVICE_LIB})
endif ()

但这次测试成功了。找到该库:

'qserialdeviced' found: /usr/lib/libqserialdeviced.so

有人可以帮我理解这里发生了什么吗?

我使用的是 Linux Fedora 13、cmake 版本 2.8.0、gcc (GCC) 4.4.5 20101112 (Red Hat 4.4.5-2) 和 kdevelop-4.1.0-1.fc13.x86_64。

谢谢我提前。


EDIT:

根据@DatChu的建议,我分开了我的CMakeLists.txt穿过我的子目录,现在一切对我来说都有意义了。

谢谢大家!


对于原始的 CMakeLists.txt 文件,问题不在于 target_link_libraries,而在于 add_executable

add_executable(uart ${uart_SRCS})

你在哪里设置了 uart_SRCS 变量?你有

set(uart_SRCS src/blahblah.cpp src/somethingblahblah.cpp)

我认为您可能误解了 add_subdirectory 的作用。它不会在里面添加源文件。它告诉 CMake 进入该文件夹并查找另一个 CMakeLists.txt。当项目文件夹中有子项目时,通常会使用它。

如果你有很多源文件不想手动设置,你也可以这样做

file(GLOB uart_SRCS src/*.cpp src/*.c)

缺点是您需要手动重新运行 CMake 才能检测新文件。请参阅 Jack 的评论,了解为什么这可能不是您想要使用的。

您的 CMakeLists.txt 很可能是

project(uart)

find_package(Qt4 REQUIRED)
include (${QT_USE_FILE})
find_package(KDE4 REQUIRED)
include (KDE4Defaults)

include_directories( ${KDE4_INCLUDES} ${QT_INCLUDES} src/include src/include/QSerialDevice )
link_directories(/usr/lib) 

file(GLOB uart_SRCS src/*.cpp src/*.h)
file(GLOB uart_HDRS include/*.h include/QSerialDevice/*.h)

find_library(SERIALDEVICE_LIB qserialdeviced)

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

Cmake target_link_libraries 未链接我的库 的相关文章

随机推荐

  • 如何在 HTTP POST 请求中传递图像并插入到数据库表中

    我需要检索表单值insert php文件以便将它们存储在数据库中 然而 表单中的元素之一是文件选择器对话框 用于上传 JPG 或其他文件格式的图像文件 我在网上找到了这段代码 可以通过发布请求发送图像 但无法使其正常工作 pic FILES
  • Django 从另一个基于类的视图调用基于类的视图

    我正在尝试调用基于类的视图并且我能够做到这一点 但由于某种原因我没有得到我正在调用的新类的上下文 class ShowAppsView LoginRequiredMixin CurrentUserIdMixin TemplateView t
  • 根据行条件过滤 pandas 列

    我有以下名为 df 的数据框 x1 x2 x3 row1 12 3 4 5 row2 1 3 4 row3 True False True 我想显示所有 row3 值都为 True 的列 很喜欢专栏x1 and x3将在本例中显示 当我想根
  • Laravel:Auth::user()->id 尝试获取非对象的属性

    当我提交表单来添加用户时 出现以下错误 尝试获取非对象的属性 该错误显然位于第一行 Auth user gt id of the following id Auth user gt id currentuser User find id u
  • 扩展 F# 中的枚举类型

    与 F 功能相关的另一个问题称为 类型扩展 http msdn microsoft com en us library dd233211 aspx 在 F 中扩展枚举似乎是不可能的 我用C 扩展方法 http msdn microsoft
  • 提高 Android 相机拍摄照片的质量/清晰度/亮度

    我有一个 Android 应用程序 我使用 Android 相机来拍照 经过一番努力 我设法将我的照片放在我想要的位置以及我想要的方式 最后的问题是图像的质量 当我的预览开始时 一切看起来都非常清晰和出色 但在拍摄照片并显示最终结果后 图像
  • 我可以 #include 定义 DWORD 的最小 Windows 标头是什么?

    我自己有一个小头文件 它声明了几个函数 其中一个函数的返回类型为DWORD 我舍不得拖进去windows h只是为了获得此类型的官方定义 因为该文件很大 并且我的标头将在许多不需要它的源模块中使用 当然 在实践中我知道DWORD只是unsi
  • Datanode 进程未在 Hadoop 中运行

    我使用以下命令设置并配置了多节点 Hadoop 集群本教程 http www michael noll com tutorials running hadoop on ubuntu linux multi node cluster form
  • 使用 ggplot2 >= 2.0 中的贴标器混合空和 bquote-d 刻面标签

    在 2 0 之前 在 ggplot2 中我可以使用element blank and labeller仅标记行或列facet grid like library ggplot2 g lt ggplot mtcars geom point a
  • 如何在 PowerPoint VBA 中模拟 ThisPresentation

    我希望能够从加载项本身的一些 VBA 代码访问 PowerPoint 加载项文件 另存为 PowerPoint 加载项 ppa 的演示文稿 的文档属性 如果它有助于理解问题 我实际上想做的是读取存储加载项版本号的自定义文档属性 以便我可以在
  • 使用 spring security 以编程方式登录用户

    其相反 如何使用 Spring Security 手动注销用户 https stackoverflow com q 5727380 106261 在我的应用程序中我有注册新用户屏幕 它发布到一个控制器 该控制器在数据库中创建一个新用户 并进
  • SSL 证书不起作用 - “无起始行”错误 - Apache2 Ubuntu 16.04.1

    我们正在办公室设置一个新的子域 并使用我们拥有的通配符 SSL 证书 我已经创建了我的密钥和 csr 文件 然后我发送到 csr 文件以获取我们现在拥有的 cer 文件 我将发布我进一步运行的命令 然后 在为我们的新域使用 a2ensite
  • 理解正则表达式 if then 语句

    所以我不确定我是否理解这是如何工作的并且想要a simple explanation to how they work是全部 我可能还差得很远 A pure regex solution is required and I don t kn
  • VBA 中的索引 (Access 2003) - 字段关联

    基于 Microsoft Access 如何知道为索引字段集合创建的字段与 TableDef 字段集合中的等效字段关联 Even in 此 Microsoft 支持页面 https support microsoft com en us k
  • 复制 DOM 元素及其事件在变量中 (jQuery)

    我想复制变量中的 DOM 元素 所以我这样做了 var before someid html 然后我的脚本在这个 someid DOM 中做了很多事情 完成后我像以前一样恢复了 DOM someid html 之前 这工作正常 但问题是我在
  • 响应使浏览器不执行任何操作 - 这可能吗?

    是否有可能做出这样的 HTTP 响应 浏览器会忽略它并继续显示先前显示的页面 我的意思是以下场景 a 用户点击某物 b 一些 POST 发送到服务器 或 GET 但我们还是使用 POST 因为更有趣 c 服务器由于某种原因决定此时不想发送回
  • Python 命令行(参数太少)

    我的 python 系统调用有问题 我已经设置了 python 路径和路径文本 这些命令适用于我的计算机 run py python runWithParamater py parameterExample txt 但如果我跑 runWit
  • gae 错误:AttributeError:“NoneType”对象没有属性“user_is_member”

    class Thread db Model members db StringListProperty def user is member self user return str user in self members and thr
  • 使用 AWS Elastic LoadBalancer 公开 kubernetes 应用程序

    我创建了一个内部 AWS 弹性应用程序负载均衡器 并在 AWS 控制台中将其状态显示为活动 请注意 我使用 jenkins 作业创建了此 ALB 并且在该作业中我指定了我的 AWS EC2 实例服务器 该服务器配置为我的 kubernete
  • Cmake target_link_libraries 未链接我的库

    我将开始声明我在 Cmake 问题上几乎完全愚蠢 我有以下内容CMakeLists txt对于 Kdevelop 4 1 项目 project uart find package KDE4 REQUIRED include KDE4Defa