GCC编译错误

1./usr/bin/ld:/tmp/ccd/UkmoA.o :undefined reference to symbol ‘ERR_free_strings@OPENSSL_1.0.0’
//lib/i386-linux-gnu/libcrypto.so.1.0.0:error adding symbols:DSO missing from command line

error1:

解决方法:
makefile 文件中加入 –lcrypto (放在-lssl之后)
指定程序的动态链接库libcrypto.so.1.0.0

2./usr/lib/ld :can’t find -lmysqlclient

error2:

解决方法:
因为动态库文件mysqlclient没在默认路径下(/usr/lib /lib /usr/local/lib).
所以需要指明动态链接库的路径 :-L/usr/lib/mysql/ -lmysqlclient

3.error while loading shared libraries:libmysqlclient.so.18:can’t open shared object file :no such file or directory

error3:

解决方法:
1. 编辑/etc/ld.so.conf文件,加入 libmysqlclient.so.18所在在的路径:/usr/lib/mysql


2. 然后执行命令:
$ ldconfig
ldconfig 命令的用途主要是在默认目录 (/usr/lib、/lib)以及动态库配置文件/etc/ld.so.conf所列目录下搜索出可共享的动态链接库(libxxxx.so*),进而创建出动态装入程序(ld.so)。所需的连接和缓存文件。缓存文件默认是/etc/ld.so.cache,此文件保存以排好序的动态链接库名字列表。

GCC编译基本过程

预处理->编译->连接->加载

  • 预处理:#开头
  • 编译:程序构建过程, 生成.o文件,gcc 依赖顺序问题(从后向前),如果文件a依赖于文件b,那么编译的时候必须把a放前面,b放后面。
  • 连接:将所有的对象文件和库串联起来,成为可运行程序。静态库已经植入程序,共享库在程序中包含其引用。
  • 加载:程序启动,引用共享库,GCC编译器假定所有的共享库以lib开头,以.so或者.a结尾。

GCC动态库与共享库

  • 什么是动态库与共享库?
    每个人的代码不可能从0写起,需要调用各种库函数,静态库编译时加载,动态库运行时加载。
    静态库的格式:libxxxx.a
    动态库的格式:libxxxx.so.major.minor xxxx为该lib的名称 major主版本号 minor副版本号

  • 如何知道一个可执行程序依赖哪些库

    解释:
    可执行程序ln依赖于libc库和ld-linux库

  • 如何定位共享库文件
    a. -l(小写的l)
    用于指定程序要链接的库,-l后面紧接着(没有空格)就是库名xxxx(去掉lib和.so)
    Ps:放在默认路径(/lib ,/usr/lib , /usr/local/lib)的库直接用-i参数就能链接,只需编译时加上 –lxxxx 就能使用libxxxx.so,程序中include libxxxx.so对应的头文件,就可以调用该库的函数。
    b. -L(大写的L)
    但是libxxxx.so没有放在默认的三个路径下时,就需要-L指定libxxxx.so的路径,否则程序就会报错(can’t find -lxxxx)。
    假设libxxxx.so所在目录为/aa/bb/cc,那么使用格式如下:-L/aa/bb/cc –lxxxx

ldconfig指令详解

ldconfig 命令的用途主要是在默认目录 (/usr/lib、/lib)以及动态库配置文件/etc/ld.so.conf所列目录下搜索出可共享的动态链接库(libxxxx.so*),进而创建出动态装入程序(ld.so)。所需的连接和缓存文件。缓存文件默认是/etc/ld.so.cache,此文件保存以排好序的动态链接库名字列表。

程序连接(运行)时首先在/etc/ld.so.cache查找共享库,找不到的话然后再到/etc/ld.so.conf的路径里面去查找。
linux启动时会执行一次该命令,之后如果修改了/lib/或/usr/lib,安装了新的动态链接库时,一定要执行一次$ldconfig。

Ps:

  • 往/lib和/usr/lib里面加东西,是不用修改/etc/ld.so.conf的,但是完了之后要调一下ldconfig
  • 默认目录以外添加动态链接库,一定要修改/etc/ld.so.conf,然后再调用ldconfig
  • 比如之前安装mysql-connector-c-6.1.11-linux-glibc2.12-i686,将其lib文件夹中的mysqlclient动态链接库拷贝到/usr/lib/mysql文件夹下,这时就需要在/etc/ld.so.conf下面加一行/usr/lib/mysql/,保存过后ldconfig一下,新的library才能在程序运行时被找到。
  • 如果想在这两个目录以外放lib,但是又不想在/etc/ld.so.conf中加东西(或者是没有权限加东西)。那也可以,就是export一个全局变量LD_LIBRARY_PATH,然后运行程序的时候就会去这个目录中找library。一般来讲这只是一种临时的解决方案,在没有权限或临时需要的时候使用。
  • ldconfig做的这些东西都与运行程序时有关,跟编译时一点关系都没有。编译的时候还是该加-L就得加,不要混淆了。
  • 总之,就是不管做了什么关于library的变动后,最好都ldconfig一下,不然会出现一些意想不到的结果。不会花太多的时间,但是会省很多的事。

makefile 语法 /usr/bin/ld: cannot find -lxxxx相关推荐

  1. Makefile的书写规则以及/usr/bin/ld: cannot find -lc

    从学习Linux那一刻开始,一直就有人说,能不能写Makefile是考验你是否具备完成大型工程的能力. makefile关系到了整个工程的编译规则.一个工程中的源文件不计数,其按类型.功能.模块分别放 ...

  2. 找不到/usr/bin/ld: 找不到 -lxxxx

    找不到/usr/bin/ld: 找不到 -lxxxx 第一步:看看find_package有没有这个库,如果没有加上试一下. 第二步:如果find_package加上之后还是没有解决的话查看deps下 ...

  3. usr / bin / ld:找不到-l <nameOfTheLibrary>

    本文翻译自:usr/bin/ld: cannot find -l I'm trying to compile my program and it returns this error : 我正在尝试编 ...

  4. 解决OpenCV4出现“/usr/bin/ld:cannot find -lcudart_static.../usr/bin/ld: cannot find -lx86_64-linux-gnu“问题

    Ubuntu18.04解决OpenCV4出现"/usr/bin/ld: cannot find -lcudart_static.../usr/bin/ld: cannot find -lx8 ...

  5. cuda8.0 出错:/usr/bin/ld: 找不到 -lGL【转】

    本文转自:https://blog.csdn.net/u010159842/article/details/56833030 最近在学习深度学习,在搭建CUDA8.0的时候,出现一个非常不好的问题: ...

  6. 【Bugfix系列】/usr/bin/ld: cannot find -lxxx 的解决办法

    DATE:2021.9.23 文章目录 1.前言 2.参考 3.解决方案 3.1.安装此库文件和相关软件 3.2.将库文件所在路径添加到gcc的搜索路径 3.2.1.使用 /etc/ld.so.con ...

  7. 精辟!(/usr/bin/ld: cannot find -lxxx)可能出现的问题和原因

    (/usr/bin/ld: cannot find -lxxx) 转载注明出处: http://www.eefocus.com/wicoboy/blog/13-03/292170_cdab5.html ...

  8. usr/bin/ld: i386 architecture of input file XXX.a( xxx.o) is incompatible with i386:x86-64

    问题:usr/bin/ld: i386 architecture of input file XXX.a( xxx.o) is incompatible with i386:x86-64 output ...

  9. 找不到ld-linux.so.3,usr/bin/ld: cannot find 错误解决方法和 /etc/ld.so.conf

    我makefile出现这个错误: HelloWorldServer.c:(.text+0xaa): undefined reference to `zmq_send' collect2: error: ...

最新文章

  1. 电脑只有一个c盘怎么办_电脑的C盘快满了怎么办
  2. 1.2.3 OSI参考模型(2)
  3. idea本地跑如何看gc日志_牛逼了!用 IDEA 扒出了开源组件导致FGC的原因
  4. python基于opencv的手势识别_怎么在Python3.5 中利用OpenCV实现一个手势识别功能
  5. LA 3523 圆桌骑士
  6. win7连接sftp_SFTP远程连接服务器上传下载文件-vs2010项目实例
  7. 函数上下文this和参数列表arguments介绍
  8. GD32F103学习笔记(4)——GPIO接口使用
  9. 【推荐】2022年AIOT人工智能物联网行业研究报告市场应用分析白皮书(附件中为网盘地址,报告持续更新)
  10. 冷高轮时间 小人人体形状造型 手势 麻将 扑克 数字时钟APP android安卓版本/iOS苹果版本
  11. 医院HIS系统厂家统计
  12. json 格式字符串
  13. 图像工作回顾之五:视频检索
  14. gh-ost修改数据量较大表结构实战
  15. 男人30岁之前不必在乎的事
  16. 简单汇总整理IC芯片检测的几种主要方法
  17. 研究:非英语背景移民更易识别澳大利亚俚语
  18. 【数据挖掘】频繁模式挖掘及Python实现
  19. 聊聊阿伦·艾佛森这个人
  20. PETS渗透测试标准总结

热门文章

  1. Ubuntu18.04连接不上校园无线网怎么办?
  2. 自动代理proxy.pac
  3. js拼接字符串时数据类型的隐式转换
  4. 开通斐讯橙汁plus会员 获取白金奖励计划
  5. vue-router 中 meta的用法
  6. 堆栈出栈顺序个数详解——卡兰特数
  7. Java Web应用实践
  8. 如何提高图表设计与制作技巧,看这一文章就够了
  9. [转贴][人生]工作两年后感悟的《大话西游》
  10. 生物信息学习——cufflinks