makefile 语法 /usr/bin/ld: cannot find -lxxxx

2024-08-21 14:08

本文主要是介绍makefile 语法 /usr/bin/ld: cannot find -lxxxx,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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一下,不然会出现一些意想不到的结果。不会花太多的时间,但是会省很多的事。
————————————————
版权声明:本文为CSDN博主「ITRunningGirl」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u013693367/article/details/78929985

这篇关于makefile 语法 /usr/bin/ld: cannot find -lxxxx的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1093377

相关文章

Makefile简明使用教程

文章目录 规则makefile文件的基本语法:加在命令前的特殊符号:.PHONY伪目标: Makefilev1 直观写法v2 加上中间过程v3 伪目标v4 变量 make 选项-f-n-C Make 是一种流行的构建工具,常用于将源代码转换成可执行文件或者其他形式的输出文件(如库文件、文档等)。Make 可以自动化地执行编译、链接等一系列操作。 规则 makefile文件

C++语法知识点合集:11.模板

文章目录 一、非类型模板参数1.非类型模板参数的基本形式2.指针作为非类型模板参数3.引用作为非类型模板参数4.非类型模板参数的限制和陷阱:5.几个问题 二、模板的特化1.概念2.函数模板特化3.类模板特化(1)全特化(2)偏特化(3)类模板特化应用示例 三、模板分离编译1.概念2.模板的分离编译 模版总结 一、非类型模板参数 模板参数分类类型形参与非类型形参 非类型模板

Java基础回顾系列-第一天-基本语法

基本语法 Java基础回顾系列-第一天-基本语法基础常识人机交互方式常用的DOS命令什么是计算机语言(编程语言) Java语言简介Java程序运行机制Java虚拟机(Java Virtual Machine)垃圾收集机制(Garbage Collection) Java语言的特点面向对象健壮性跨平台性 编写第一个Java程序什么是JDK, JRE下载及安装 JDK配置环境变量 pathHe

ImportError: cannot import name ‘print_log‘ from ‘logging‘

mmcv升级到2.+后删除了很多 解决 查FAQ文档,找到 添加到mmcv.utils下即可

vue 父组件调用子组件的方法报错,“TypeError: Cannot read property ‘subDialogRef‘ of undefined“

vue 父组件调用子组件的方法报错,“TypeError: Cannot read property ‘subDialogRef’ of undefined” 最近用vue做的一个界面,引入了一个子组件,在父组件中调用子组件的方法时,报错提示: [Vue warn]: Error in v-on handler: “TypeError: Cannot read property ‘methods

Hibernate框架中,使用JDBC语法

/*** 调用存储过程* * @param PRONAME* @return*/public CallableStatement citePro(final String PRONAME){Session session = getCurrentSession();CallableStatement pro = session.doReturningWork(new ReturningWork<C

ORACLE语法-包(package)、存储过程(procedure)、游标(cursor)以及java对Result结果集的处理

陈科肇 示例: 包规范 CREATE OR REPLACE PACKAGE PACK_WMS_YX IS-- Author : CKZ-- Created : 2015/8/28 9:52:29-- Purpose : 同步数据-- Public type declarations,游标 退休订单TYPE retCursor IS REF CURSOR;-- RETURN vi_co_co

ElasticSearch的DSL查询⑤(ES数据聚合、DSL语法数据聚合、RestClient数据聚合)

目录 一、数据聚合 1.1 DSL实现聚合 1.1.1 Bucket聚合  1.1.2 带条件聚合 1.1.3 Metric聚合 1.1.4 总结 2.1 RestClient实现聚合 2.1.1 Bucket聚合 2.1.2 带条件聚合 2.2.3 Metric聚合 一、数据聚合 聚合(aggregations)可以让我们极其方便的实现对数据的统计、分析、运算。例如:

react笔记 8-16 JSX语法 定义数据 数据绑定

1、jsx语法 和vue一样  只能有一个根标签 一行代码写法 return <div>hello world</div> 多行代码返回必须加括号 return (<div><div>hello world</div><div>aaaaaaa</div></div>) 2、定义数据 数据绑定 constructor(){super()this.state={na

Unstructured cannot write mode RGBA as JPEG 错误解决

Unstructured cannot write mode RGBA as JPEG 错误解决 0. 错误详细1. 解决方法 0. 错误详细 Image Extraction Error: Skipping the failed imageTraceback (most recent call last):File "/root/miniconda3/envs/learn-y