【问题标题】:C std library don't appear to be linked in object fileC std 库似乎没有在目标文件中链接
【发布时间】:2015-06-07 13:24:06
【问题描述】:

我正在使用这样的程序,其中使用了 math.h 函数“sin”和 stdio.h 函数“printf”

#include <stdio.h>
#include <math.h>

int main ()
{

    int x = sin(14);
    printf("hello");
    return 0;
}

正如 ephemient here 所说,libc.so 和 libm.so(用于数学函数)应该已经与程序链接,尽管当我使用选项“在目标文件上运行 otool(类似于 objdump)时” -L" 打印使用的共享库,libc.so 或 libm.so 都不打印

otool -L com_ex1.o

那是什么原因呢?我使用 otool 错了吗?或者那些库不应该显示为共享库?

【问题讨论】:

    标签: c macos unix objdump otool


    【解决方案1】:

    您链接完成的二进制文件,中间对象文件不会链接,直到它们与使用的库一起在最终二进制文件中链接在一起。

    因此,当您生成目标文件时,不会发生链接,因此没有证据表明目标文件中的任何库的链接是合乎逻辑的,因为没有。

    【讨论】:

    • 是的,这就是重点(写我的时候没看到你回答)。
    【解决方案2】:

    动态库链接到最终的可执行文件,而不是 到目标文件,所以你应该运行(例如)

    otool -L com_ex1
    

    这应该显示类似

    com_ex1: /usr/lib/libSystem.B.dylib(兼容版本 1.0.0,当前版本 1213.0.0)

    因为在 OS X 上,数学库是 libSystem 的一部分:

    $ ls -l /usr/lib/libm.dylib lrwxr-xr-x 1 根轮 15 月 3 日 01:39 /usr/lib/libm.dylib@ -> libSystem.dylib

    【讨论】:

    • 有趣,我不知道关于 OS X,但我想如果使用 glibc 那么与 OP 的预期没有什么区别。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-24
    • 2019-09-18
    • 2018-02-02
    • 1970-01-01
    相关资源
    最近更新 更多