使用cmake 构建构建新项目的时候,编译提示库找不到怎么办?

news/2024/11/17 2:43:56/

昨天帮其他部门同事解决Linux下Qt编译找不到Qt 依赖库 core的问题。过程很有特征性,可以推广到Linux下使用cmake构建项目时找不到库文件的广泛性问题。

先上图,结合事情经过讲述:

事情经过:

  •  这里给大家介绍第一个重点: Qt在6.0之后,对很多的常用库做了修改,所以经常会出现5.9的代码在新版本上编译不起来的问题,这件事在博主去年想用Qt自己写一个xml文件的格式化输出修改的小工具时候,发现的。官网的版本更新里面介绍了这件事情,但是网络上关于这点的讨论却很少。这里提一下希望大家技术选型时不要再踩坑。

  • 信息有限,在添加路径之后,还是找不到,因此考虑是否是根本就没有,所以找不到。
  • 故而采取重装大法,在再次安装的时候,勾选core 库,同样的插一嘴:搞运维和测试的同学,在部署环境和搭建实验室时,一定要和研发同学沟通,系统版本、软件依赖版本、组件包含多少东西。
  • 不要觉得博主唧唧歪歪。这都是血泪教训,当年博主被叫到长沙时,运维实施的同学信誓旦旦的说实验室已经搭建完成了。可是博主到了之后,发现服务器装的redhead连 c++开发环境都没有。也没有可视化界面,还要博主重头刻启动盘安装。然后惠普服务器还发现做不了raid5。叫来厂家还不行,博主就在长沙冬天冰冷的项目部里解决问题。o_0。

  •  项目如果可以,请放在根目录下。
  • 这是因为很多时候,home下面创建的用户,自身的环境变量和root的不一致。而在运行时候,如无特殊指定,程序是会交给root下的shell 进程来fork新的子进程执行的。这时候会出现root下的PATH宏中不包含正确的依赖路径,从而导致编译或者运行错误。
  • 这样的错误包括但不限于:
    • Python 多版本问题(可以用pyenv解决)
    • libc.so多版本问题(可以用忍者解决)
    • 依赖库问题(可以指定位置解决)

 

  • cmake 的分支路线是逐层的找到下层中的cmake,有点像是makefile找子文件夹中的makefile。
  • include subdir/Makefile
    

好了,到此事件结束。让我们总结前,扩充一点:

  • 在CMake中,find_package和find_library都是用于查找依赖库的命令,但它们的作用略有不同。

  • find_package用于查找安装在系统上的库,它会在系统路径和CMAKE_PREFIX_PATH中查找库的头文件和库文件,并将它们添加到CMake的变量中,以便在后续的编译过程中使用。同时,它还会检查库的版本和依赖关系,以确保库的正确性。
  • find_library则是用于查找指定名称的库文件,它会在指定的路径中查找库文件,并将其添加到CMake的变量中。它不会检查库的版本和依赖关系,因此需要手动指定库的路径和版本信息。

  • 总的来说,find_package更适用于查找系统安装的库,而find_library更适用于查找自定义的库文件。

 总结:cmake编译时报错库文件找不到的原因和对应的各种解决方案

当使用CMake进行编译时,可能会遇到库文件找不到的错误。这通常是由于以下原因之一导致的:

  1. 库文件未正确安装或未正确配置路径。
  2. CMakeLists.txt文件中未正确指定库文件路径。
  3. 编译器未正确配置库文件路径。

针对这些问题,可以采取以下解决方案:

  1. 确保库文件已正确安装并配置路径。可以使用命令行工具或IDE来检查库文件是否存在,并确保路径正确。

  2. 在CMakeLists.txt文件中正确指定库文件路径。可以使用以下命令来指定库文件路径:

link_directories(/path/tobrary)
  1. 或者使用 message命令打印 PATH的内容。查看到底有无正确加载。
message("PATH = $ENV{PATH}")
  1. 在编译器中正确配置库文件路径。可以使用以下命令来配置库文件路径:
-L/path/tobrary

以上是一些常见的解决方案,但具体解决方案可能因具体情况而异。如果以上解决方案无法解决问题,请提供更多详细信息,留在评论区,以便博主更好地帮助您解决问题。

解决稀奇古怪的问题也是对博主的一种成长。


http://www.ppmy.cn/news/73407.html

相关文章

07-通过RocketMQ和Redis实现用户动态提醒

1、用户动态表 CREATE TABLE `t_user_moments` (`id` bigint(12) unsigned NOT NULL AUTO_INCREMENT COMMENT 主键id,`user_id` bigint(12) DEFAULT NULL COMMENT 用户id,`user_type` int(8) DEFAULT NULL COMMENT 动态类型:0视频 1直播 2专栏动态,`contend_id` bigint(12) D…

目标检测复盘 --3. Fast RCNN

RCNN的CNN部分使用AlexNet作为backbone来提取特征,Fast RCNN使用了VGG16来作为backboneRCNN将2000个框送入网络提取特征,Fast RCNN是将图像送入CNN来提取特征得到一个特征图将SS(Selective Search)算法获取的提议框映射到上面的特征图上,获取…

MySQL数据库笔记——进阶篇

文章目录 存储引擎MySQL体系结构存储引擎简介InnoDB介绍MyISAMMemory 存储引擎的选择小结 索引概述索引结构概述BtreeBTreeHash 存储引擎 MySQL体系结构 连接层: 最上层是一些客户端和链接服务,主要完成一些类似于连接处理、授权认证、及相关的安全方案…

KVM虚拟化(二)

文章目录 4.7 kvm虚拟机克隆4.7.1 完整克隆4.7.2 链接克隆 4.8 kvm虚拟机的桥接网络4.8.1 创建桥接网卡4.8.2 新虚拟机使用桥接模式4.8.3 将已有虚拟机网络修改为桥接模式 4.9 热添加技术4.9.1 kvm热添加硬盘4.9.2 kvm虚拟机在线热添加网卡4.9.3 kvm虚拟机在线热添加内存4.9.4 …

FFmpeg命令实战(中)

标题 1.ffplay命令播放2.ffplay简单过滤器3 .ffmpeg命令参数1.主要参数2. 音频参数3.视频参数 4.ffmpeg命令提取音视频数据1.保留封装格式2.提取视频3.提取音频 5.ffmpeg提取像素格式1.提取YUV2.提取RGB3.提取PCM 5.ffmpeg命令转封装格式1.保持编码格式2.改变编码格式3.修改帧率…

【密码学复习】第八讲 数字签名

数字签名(Digital Signature),也称电子签名,是指附加在某一电子文档中的一组特定的符号或代码,它是利用数学方法对该电子文档进行关键信息提取并与用户私有信息进行混合运算而形成的,用于标识签发者的身份以…

基于MATLAB的车牌识别系统+GUI界面的毕业设计(完整源码+课题报告+说明文档+数据)

文章目录 1. 前言2. 实现步骤1)颜色信息提取2)倾斜校正3)字符分割4)字体识别5)语音播报6)存储数据 3. 总结4. 完整源码下载 1. 前言 近年来,随着交通现代化的发展要求,汽车牌照自动识别技术已经越来越受到…

Python学习29:存款买房(B)

描述‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬ 你刚刚大学毕业,…