ld 找不到现有库

2024-10-11 08:36:00
admin
原创
167
摘要:问题描述:我正在尝试在这个 Debian lenny 系统上将一个应用程序与 g++ 链接起来。ld 抱怨它找不到指定的库。这里的具体示例是 ImageMagick,但我也遇到了其他几个库的类似问题。我正在使用以下命令调用链接器:g++ -w (..lots of .o files/include direc...

问题描述:

我正在尝试在这个 Debian lenny 系统上将一个应用程序与 g++ 链接起来。ld 抱怨它找不到指定的库。这里的具体示例是 ImageMagick,但我也遇到了其他几个库的类似问题。

我正在使用以下命令调用链接器:

g++ -w (..lots of .o files/include directories/etc..) \n-L/usr/lib -lmagic

ld 抱怨:

/usr/bin/ld: cannot find -lmagic

但是,libmagic 存在:

$ locate libmagic.so
/usr/lib/libmagic.so.1
/usr/lib/libmagic.so.1.0.0
$ ls -all /usr/lib/libmagic.so.1*
lrwxrwxrwx 1 root root    17 2008-12-01 03:52 /usr/lib/libmagic.so.1 -> libmagic.so.1.0.0
-rwxrwxrwx 1 root root 84664 2008-09-09 00:05 /usr/lib/libmagic.so.1.0.0
$ ldd /usr/lib/libmagic.so.1.0.0 
    linux-gate.so.1 =>  (0xb7f85000)
    libz.so.1 => /usr/lib/libz.so.1 (0xb7f51000)
    libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb7df6000)
    /lib/ld-linux.so.2 (0xb7f86000)
$ sudo ldconfig -v | grep "libmagic"
    libmagic.so.1 -> libmagic.so.1.0.0

我该如何进一步诊断这个问题?可能出了什么问题?我是不是做了一件非常愚蠢的事情?


解决方案 1:

问题是链接器正在寻找libmagic.so,但你只有libmagic.so.1

一个快速的破解方法是符号链接libmagic.so.1libmagic.so

解决方案 2:

正如 grepsedawk 所表述的,答案在于选项-lg++即调用ld。如果您查看此命令的手册页,您可以执行以下操作:

  • g++ -l:libmagic.so.1 [...]

  • 或者:g++ -lmagic [...]如果你的库路径中有一个名为 libmagic.so 的符号链接

解决方案 3:

Debian 习惯将共享库分为运行时组件(libmagic1: /usr/lib/libmagic.so.1 → libmagic.so.1.0.0)和开发组件(libmagic-dev: /usr/lib/libmagic.so → …)。

因为库的 soname 是libmagic.so.1,所以它是嵌入到可执行文件中的字符串,因此它是运行可执行文件时加载的文件。

但是,由于该库是针对-lmagic链接器指定的,因此它会查找libmagic.so,这就是为什么开发需要它的原因。

有关这一切在 Linux 上如何运作的详细信息,请参阅Diego E. Pettenò:链接器和名称。


简而言之,你应该apt-get install libmagic-dev。这不仅会给你,libmagic.so还会给你编译所需的其他文件,比如/usr/include/magic.h

解决方案 4:

在 Ubuntu 中,您可以安装libtool可自动解析库的程序。

$ sudo apt-get install libtool

这为我解决了一个问题ltdl,它已安装为但在 make 中libltdl.so.7找不到。-lltdl

解决方案 5:

如上所述,链接器正在寻找libmagic.so,但您只有libmagic.so.1

要解决这个问题,只需执行更新缓存。

ldconfig -v 

为了验证您是否可以运行:

$ ldconfig -p | grep libmagic

解决方案 6:

除非我大错特错libmagic,或者-lmagic它与 ImageMagick 不是同一个库。您声明您想要 ImageMagick。

ImageMagick 附带一个实用程序,可为编译器提供所有适当的选项。

前任:

g++ program.cpp `Magick++-config --cppflags --cxxflags --ldflags --libs` -o "prog"

解决方案 7:

从 Ubuntu repo 安装 libgl1-mesa-dev 为我解决了这个问题。

解决方案 8:

我尝试了上面提到的所有解决方案,但没有一个能解决我的问题,但最终我使用以下命令解决了它。

sudo apt-get install libgmp3-dev

这将产生神奇的效果。

解决方案 9:

解决此问题的另一种方法是安装该-devel包。

如果编译器正在寻找libabc.so您有的libabc.so.1,您需要安装该-devel包,libabc-devel就像libabc.so.1一个运行时库但是libabc.so一个开发库一样。

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1120  
  IPD(Integrated Product Development,集成产品开发)流程是一种广泛应用于高科技和制造业的产品开发方法论。它通过跨职能团队的紧密协作,将产品开发周期缩短,同时提高产品质量和市场成功率。在IPD流程中,CDCP(Concept Decision Checkpoint,概念决策检查点)是一个关...
IPD培训课程   75  
  研发IPD(集成产品开发)流程作为一种系统化的产品开发方法,已经在许多行业中得到广泛应用。它不仅能够提升产品开发的效率和质量,还能够通过优化流程和资源分配,显著提高客户满意度。客户满意度是企业长期成功的关键因素之一,而IPD流程通过其独特的结构和机制,能够确保产品从概念到市场交付的每个环节都围绕客户需求展开。本文将深入...
IPD流程   66  
  IPD(Integrated Product Development,集成产品开发)流程是一种以跨职能团队协作为核心的产品开发方法,旨在通过优化资源分配、提高沟通效率以及减少返工,从而缩短项目周期并提升产品质量。随着企业对产品上市速度的要求越来越高,IPD流程的应用价值愈发凸显。通过整合产品开发过程中的各个环节,IPD...
IPD项目管理咨询   76  
  跨部门沟通是企业运营中不可或缺的一环,尤其在复杂的产品开发过程中,不同部门之间的协作效率直接影响项目的成败。集成产品开发(IPD)作为一种系统化的项目管理方法,旨在通过优化流程和增强团队协作来提升产品开发的效率和质量。然而,跨部门沟通的复杂性往往成为IPD实施中的一大挑战。部门之间的目标差异、信息不对称以及沟通渠道不畅...
IPD是什么意思   70  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用