我makefile出现这个错误:

HelloWorldServer.c:(.text+0xaa): undefined reference to `zmq_send'

collect2: error: ld returned 1 exit status

make: *** [HelloWorldServer] Error 1

一直以为没找到动态库,但是指定了具体路径:

LDFLAGS=  -L /opt/zeromq/lib -lzmq

$(CC)  $(CFLAGS) $(LDFLAGS) -o $@ $^

为什么还是报错???

改正:要把动态库放在-o 后面,这样就对了。

$(CC)  $(CFLAGS)  -o $@ $^  $(LDFLAGS) 可以编译。

gcc测试动态库

gcc -lmysqlcient形式。

ldconfig -v列出所有可用的动态库

通常在软件编译时出现的usr/bin/ld: cannot find -lxxx的错误,主要的原因是库文件并没有导入的ld检索目录中。

解决方式:

1。确认库文件是否存在,比如-l123, 在/usr/lib, /usr/local/lib,或者其他自定义的lib下有无lib123.so, 如果只是存在lib123.so.1,

那么可以通过ln -sv lib123.so.1   lib123.so,建立一个连接重建lib123.so.

2。检查/etc/ld.so.conf中的库文件路径是否正确,如果库文件不是使用系统路径,/usr/lib, /usr/local/lib, 那么必须在文件中加入。

3。ldconfig 重建ld.so.cache文件,ld的库文件检索目录存放文件。尤其刚刚编译安装的软件,必须运行ldconfig,才能将新安装的

库文件导入ld.so.cache.

4。测试,gcc -l123 --verbose.

/etc/ld.so.conf文件

Linux 系统上有两类根本不同的 Linux 可执行程序。第一类是静态链接的可执行程序。静态可执行程序包含执行所需的所有函数 — 换句话说,它们是“完整的”。因为这一原因,静态可执行程序不依赖任何外部库就可以运行。

第二类是动态链接的可执行程序。

静态可执行程序与动态可执行程序比较

我们可以用 ldd 命令来确定某一特定可执行程序是否为静态链接的:

# ldd /sbin/sln

not a dynamic executable

“not a dynamic executable”是 ldd 说明 sln 是静态链接的一种方式。现在,让我们比较 sln 与其非静态同类 ln 的大小:

# ls -l /bin/ln /sbin/sln

-rwxr-xr-x    1 root     root        23000 Jan 14 00:36 /bin/ln

-rwxr-xr-x    1 root     root       381072 Jan 14 00:31 /sbin/sln

如您所见,sln 的大小超过 ln 十倍。ln 比 sln 小这么多是因为它是动态可执行程序。动态可执行程序是不完整的程序,它依靠外部共享库来提供运行所需的许多函数。

动态链接相关性

要查看 ln 依赖的所有共享库的列表,可以使用 ldd 命令:

# ldd /bin/ln

libc.so.6 => /lib/libc.so.6 (0x40021000)

/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

如您所见,ln 依赖外部共享库 libc.so.6 和 ld-linux.so.2。通常,动态链接的程序比其静态链接的等价程序小得多。不过,静态链接的程序可以在某些低级维护任务中发挥作用。例如,sln 是修改位于 /lib 中的不同库符号链接的极佳工具。但通常您会发现几乎所有 Linux 系统上的可执行程序都是某种动态链接的变体。

动态装入器

那么,如果动态可执行程序不包含运行所需的所有函数,Linux 的哪部分负责将这些程序和所有必需的共享库一起装入,以使它们能正确执行呢?答案是动态装入器(dynamic loader),它实际上是您在 ln 的 ldd 清单中看到的作为共享库相关性列出的 ld-linux.so.2 库。动态装入器负责装入动态链接的可执行程序运行所需的共享库。现在,让我们迅速查看一下动态装入器如何在系统上找到适当的共享库。

ld.so.conf

动态装入器找到共享库要依靠两个文件 — /etc/ld.so.conf 和 /etc/ld.so.cache。如果您对 /etc/ld.so.conf 文件进行 cat 操作,您可能会看到一个与下面类似的清单:

$ cat /etc/ld.so.conf

/usr/X11R6/lib

/usr/lib/gcc-lib/i686-pc-linux-gnu/2.95.3

/usr/lib/mozilla

/usr/lib/qt-x11-2.3.1/lib

/usr/local/lib

ld.so.conf 文件包含一个所有目录(/lib 和 /usr/lib 除外,它们会自动包含在其中)的清单,动态装入器将在其中查找共享库。

ld.so.cache

但是在动态装入器能“看到”这一信息之前,必须将它转换到 ld.so.cache 文件中。可以通过运行 ldconfig 命令做到这一点:

# ldconfig

当 ldconfig 操作结束时,您会有一个最新的 /etc/ld.so.cache 文件,它反映您对 /etc/ld.so.conf 所做的更改。从这一刻起,动态装入器在寻找共享库时会查看您在 /etc/ld.so.conf 中指定的所有新目录。

ldconfig 技巧

要查看 ldconfig 可以“看到”的所有共享库,请输入:

# ldconfig -p | less

还有另一个方便的技巧可以用来配置共享库路径。有时候您希望告诉动态装入器在尝试任何 /etc/ld.so.conf 路径以前先尝试使用特定目录中的共享库。在您运行的较旧的应用程序不能与当前安装的库版本一起工作的情况下,这会比较方便。

LD_LIBRARY_PATH

要指示动态装入器首先检查某个目录,请将 LD_LIBRARY_PATH 变量设置成您希望搜索的目录。多个路径之间用冒号分隔;例如:

# export LD_LIBRARY_PATH="/usr/lib/old:/opt/lib"

导出 LD_LIBRARY_PATH 后,如有可能,所有从当前 shell 启动的可执行程序都将使用 /usr/lib/old 或 /opt/lib 中的库,如果仍不能满足一些共享库相关性要求,则转回到 /etc/ld.so.conf 中指定的库。

http://blog.csdn.net/yyyzlf/article/details/5283885

LD_LIBRARY_PATH

Linux环境变量名,该环境变量主要用于指定查找共享库(动态链接库)时除了默认路径之外的其他路径。(该路径在默认路径之前查找)

移植程序时的经常碰到需要使用一些特定的动态库,而这些编译好的动态库放在我们自己建立的目录里,这时可以将这些目录设置到LD_LIBRARY_PATH中。

当执行函数动态链接.so时,如果此文件不在缺省目录下‘/usr/local/lib’ and ‘/usr/lib’.

那么就需要指定环境变量

LD_LIBRARY_PATH

假如现在需要在已有的环境变量上添加新的路径名,则采用如下方式:

LD_LIBRARY_PATH=NEWDIRS:$LD_LIBRARY_PATH.(newdirs是新的路径串)

Linux 运行的时候,是如何管理共享库(*.so)的?在 Linux 下面,共享库的寻找和加载是由 /lib/ld.so 实现的。 ld.so 在标准路经(/lib, /usr/lib) 中寻找应用程序用到的共享库。

但是,如果需要用到的共享库在非标准路经,ld.so 怎么找到它呢?

目前,Linux 通用的做法是将非标准路经加入 /etc/ld.so.conf,然后运行 ldconfig 生成 /etc/ld.so.cache。 ld.so 加载共享库的时候,会从 ld.so.cache 查找。

传统上,Linux 的先辈 Unix 还有一个环境变量:LD_LIBRARY_PATH 来处理非标准路经的共享库。ld.so 加载共享库的时候,也会查找这个变量所设置的路经。

LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./lib

export LD_LIBRARY_PATH

但是,有不少声音主张要避免使用 LD_LIBRARY_PATH 变量,尤其是作为全局变量。这些声音是:

* LD_LIBRARY_PATH is not the answer -

http://prefetch.net/articles/linkers.badldlibrary.html

* Why LD_LIBRARY_PATH is bad -

http://xahlee.org/UnixResource_dir/_/ldpath.html

* LD_LIBRARY_PATH - just say no -

http://blogs.sun.com/rie/date/20040710

解决这一问题的另一方法是在编译的时候通过 -R 选项指定 run-time path。

1. 往/lib和/usr/lib里面加东西,是不用修改/etc/ld.so.conf的,但是完了之后要调一下ldconfig,不然这个library会找不到

2. 想往上面两个目录以外加东西的时候,一定要修改/etc/ld.so.conf,然后再调用ldconfig,不然也会找不到

比如安装了一个mysql到/usr/local/mysql,mysql有一大堆library在/usr/local/mysql/lib下面,这时就需要在/etc/ld.so.conf下面加一行/usr/local/mysql/lib,保存过后ldconfig一下,新的library才能在程序运行时被找到。

3. 如果想在这两个目录以外放lib,但是又不想在/etc/ld.so.conf中加东西(或者是没有权限加东西)。那也可以,就是export一个全局变量LD_LIBRARY_PATH,然后运行程序的时候就会去这个目录中找library。一般来讲这只是一种临时的解决方案,在没有权限或临时需要的时候使用。

4. ldconfig做的这些东西都与运行程序时有关,跟编译时一点关系都没有。编译的时候还是该加-L就得加,不要混淆了。

5. 总之,就是不管做了什么关于library的变动后,最好都ldconfig一下,不然会出现一些意想不到的结果。不会花太多的时间,但是会省很多的事。

LD_LIBRARY_PATH 这个环境变量是大家最为熟悉的,它告诉loader:在哪些目录中可以找到共享库。可以设置多个搜索目录,这些目录之间用冒号分隔开。在linux下,还提供了另外一种方式来完成同样的功能,你可以把这些目录加到/etc/ld.so.conf中,然后调用ldconfig。当然,这是系统范围内全局有效的,而环境变量只对当前shell有效。按照惯例,除非你用上述方式指明,loader是不会在当前目录下去找共享库的,正如shell不会在当前目前找可执行文件一样。

库搜索路径的确定有很多方法,LD_LIBRARY_PATH只是其中一种。如编译命令行rpath参数.   连接时的LD_RUN_PATH环境变量。/lib,/usr/lib标准目录。动态连接器缓存/etc/ld.so.conf.

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

  1. usr/bin/ld: cannot find 错误解决方法和 /etc/ld.so.conf

    usr/bin/ld: cannot find 错误解决方法和 /etc/ld.so.conf 参考文章: (1)usr/bin/ld: cannot find 错误解决方法和 /etc/ld.so. ...

  2. linux ssh连接 出现 Host key verification failed 错误 解决方法

    错误现象: [root@cache001 swftools-0.9.0]# ssh 192.168.1.90 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ...

  3. 解决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 ...

  4. linux 安装程序丢失链接动态库,Linux安装软件过程中提示缺少动态链接库.so的解决方法...

    Linux在安装软件的时候有时会出现错误,提示缺少动态链接库.so,该问题是由什么原因导致的呢? 情况分析: 1.缺少动态连接库.so-cannot open shared object file:N ...

  5. Linux修改fstab引起系统无法启动问题的解决方法

    文章列表 crontab执行脚本出错 博客分类: Linux 最近经常碰到关于crontab不能执行的,初步总结了有以下几个原因:第一,脚本的原因:大多数情况下,是我们的脚本的问题,这种问题导致cro ...

  6. /usr/bin/python^M: 解释器错误: 没有那个文件或目录

    [1]问题现象 执行python脚本,提示错误:/usr/bin/python^M: 解释器错误: 没有那个文件或目录 [2]原因分析 大多数是因为脚本文件在windows下编辑过.在windows下 ...

  7. Linux编译遇到各种错误解决方法,例如 /lib/modules/3.10.0-(xxx).el7.x86_64/build: No such file or directory. Stop.

    Linux编译遇到各种错误解决方法,例如: /lib/modules/3.10.0-(xxx).el7.x86_64/build: No such file or directory. Stop. 背 ...

  8. linux vim m,关于linux中使用vim打开文件出现^M的解决方法

    在linux下,不可避免的会用VIM打开一些windows下编辑过的文本文件.我们会发现文件的每行结尾都会有一个^M符号,这是因为 DOS下的编辑器和Linux编辑器对文件行末的回车符处理不一致, 各 ...

  9. “ld: symbol(s) not found for architecture i386“错误解决方法

    "ld: symbol(s) not found for architecture i386"错误解决方法 参考文章: (1)"ld: symbol(s) not fou ...

最新文章

  1. oracle分页的方法,Oracle数据库分页的集中方法(三种方法)
  2. Linux如何编译安装源码包软件
  3. jar包的生成和使用简单例子
  4. Coverage analysis in ABAP in Eclipse
  5. 终于可以放下心来了,呜呜...
  6. Wasserstein metric的通俗解释
  7. Android 爱心万花筒简单实现
  8. Zephyr调整Main栈大小
  9. Unity单例模式+例子
  10. 2021-01-07
  11. 一步一步教你写股票走势图——分时图一(概述)
  12. 解二元一次方程————拓展欧几里得算法
  13. Launch文件编写
  14. AssetBundle异步加载资源阻塞主线程的疑问
  15. g的python实现_Python gevent协程切换实现详解
  16. Android旅游自助项目之订票系统订票功能实现
  17. steam如何载入已经下载好的游戏
  18. 【VSCode】提升效率
  19. 小程序的WXML WXSS
  20. 〖经典怀念〗新白娘子传奇MV之青姐17部完整原版下载

热门文章

  1. Project ERROR: Cannot run compiler 'cl'. Maybe you forgot to setup the environment?
  2. uniapp从企业微信、微信公众号获取地址栏的参数
  3. 大企业喜欢使用外包人员驻场开发软件的原因解析
  4. android手机网速,安卓手机网速慢怎么办 安卓手机网速慢解决办法【详解】
  5. chrome 图片助手下载
  6. easyconnect mac版下载地址
  7. 线上O2O商城系统怎么做好运营 O2O成为商业模式需要哪些条件?
  8. Infrastructure-Based Object Detection and Tracking for Cooperative Driving Automation: A Survey
  9. 计算机等级良好什么意思,计算机二级多少分算过?
  10. PTA(Basic Level) 1072:开学寄语(C语言实现)