【问题标题】:Eclipse-CDT on x86_64 system cannot link to shared library [duplicate]x86_64系统上的Eclipse-CDT无法链接到共享库[重复]
【发布时间】:2011-11-17 23:45:01
【问题描述】:

我在 Windows 上使用 Eclipse-CDT 编译了一些库。但是,当我尝试在 linux 下编译它们时,gcc 不断给我错误/usr/bin/ld: cannot find -lrequestedLib。我在两个环境之间使用完全相同的构建设置(即我确保添加包含我需要链接到的库的目录)。我确定系统也具有文件的读取访问权限。我不知道该怎么做。请帮忙。

编辑:这些是 ecplise 运行以构建库的命令:

gcc -I/home/me/lib/ -O3 -Wall -c -fmessage-length=0 -olibToMake.o ../libToMake.c 
gcc -L/home/me/lib/ -shared -olibToMake.so libToMake.o -lrequestedLib

编辑 2:呈现错误的命令是两者中的第二个,导致输出 /usr/bin/ld: cannot find -lrequestedLib

编辑 3:我已经确认 requestedLib.so 是 x86_64 二进制文件。

【问题讨论】:

    标签: linux shared-libraries eclipse-cdt


    【解决方案1】:

    如果您不想将-L 命令行选项传递给gcc(1),请务必将包含库的路径添加到/etc/ld.so.conf/etc/ld.so.cond.d/<something>

    安装库后,您还需要手动运行ldconfig(8)。 (大多数新用户忘记了这一步,因为典型的包管理器在安装新库时会为您处理这一点。)

    【讨论】:

    • 我正在将 -L 命令传递给 gcc... "gcc -I/home/me/lib/ -O3 -Wall -c -fmessage-length=0 -olibToMake.o .. /libToMake.c" "gcc -L/home/me/lib/ -shared -olibToMake.so libToMake.o -lrequestedLib" 是我运行的命令,但输出如它所说。我会尝试运行配置,jik
    • 不,根本没有帮助。 >_>;
    • 人力资源管理;您可以edit您的问题并将这些命令直接复制粘贴到其中吗?它们可能是帮助某人解决问题的关键。
    【解决方案2】:

    gcc -I/home/me/lib/ -O3 -Wall -c -fmessage-length=0 -olibToMake.o ../libToMake.c
    gcc -L/home/me/lib/ -shared -olibToMake.so libToMake.o -lrequestedLib

    x86_64 上构建 64 位共享库时,通常需要 -fPIC 标志,否则在共享库链接时会出现 recompile with -fPIC 错误。

    由于您没有使用-fPIC,但您的链接成功,您可能会使用(非默认)gcci*86 为目标(即产生 32 位输出)。您可以通过运行file libToMake.so 来确认。

    您没有显示 实际上 失败的命令(产生cannot find -lrequestedLib 错误的命令)。我猜 that 命令正在使用不同的 gcc(默认一个?),它以 x86_64 为目标。如果它看起来像

    gcc main.c -L/home/me/lib -lrequestedLib
    

    该命令将忽略 /home/me/lib/librequestedLib.so(因为您不能将 32 位和 64 位代码链接在一起),并将继续在别处搜索 librequestedLib。当它找不到librequestedLib 的 64 位版本时,它会产生您正在获取的错误消息。

    【讨论】:

    • 尝试添加什么???我没有建议您添加任何内容,只是您了解问题所在。我猜你加了-fPIC当然那是行不通的。但是如果我的猜测是正确的,将-m32 添加到最终二进制文件的编译和链接命令中起作用。
    • @CalebWaggoner 请不要将您的错误剪切/粘贴到 cmets 中。而是更新您的问题。您仍然没有回答最基本的问题:您的librequestedLib.so(您成功构建的那个)是 32 位还是 64 位。事实上,你一直以不同的方式命名它:memMan.solibrequestedLib.solibToMake.so 也无济于事。您只是在已经令人困惑的画面中增加了更多的混乱。
    • 关于您的第一个假设,库编译为 x86_64。对于您的第二个假设,我的系统上只有一个二进制 gcc,显然它甚至不会尝试将某些东西编译到 i*86 架构中。对于您的第三个假设,显示的两个命令是唯一运行的。 gcc 在后台运行 ld 以查找用于链接的 prereq 库。我尝试提到的原因是它可能有所帮助。但是我需要知道并且似乎无法预测的是为什么 gcc(或 ld?)在被告知时不会在库的指定目录中查找。
    • @CalebWaggoner 好的,很明显我想多了这个问题。这个问题看起来微不足道:/home/me/lib 中没有librequestedLib.sols -l /home/me/lib/librequestedLib* 说什么?
    • 所以我添加了“lib”作为前缀,这似乎解决了该链接问题。有没有办法让它查找没有前缀的库?这个库也要求一个入口点,即使它应该是一个共享库(它不是主题但是),有什么想法吗?
    猜你喜欢
    • 2013-04-13
    • 2020-06-03
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 2014-04-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多