昨天帮其他部门同事解决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进行编译时,可能会遇到库文件找不到的错误。这通常是由于以下原因之一导致的:
- 库文件未正确安装或未正确配置路径。
- CMakeLists.txt文件中未正确指定库文件路径。
- 编译器未正确配置库文件路径。
针对这些问题,可以采取以下解决方案:
-
确保库文件已正确安装并配置路径。可以使用命令行工具或IDE来检查库文件是否存在,并确保路径正确。
-
在CMakeLists.txt文件中正确指定库文件路径。可以使用以下命令来指定库文件路径:
link_directories(/path/tobrary)
- 或者使用 message命令打印 PATH的内容。查看到底有无正确加载。
message("PATH = $ENV{PATH}")
- 在编译器中正确配置库文件路径。可以使用以下命令来配置库文件路径:
-L/path/tobrary
以上是一些常见的解决方案,但具体解决方案可能因具体情况而异。如果以上解决方案无法解决问题,请提供更多详细信息,留在评论区,以便博主更好地帮助您解决问题。
解决稀奇古怪的问题也是对博主的一种成长。