OSX 上的 ld 命令

ld command on OSX

我想在 Mac OS X 上使用 ld 命令使用动态共享库“.so”文件。

我能够正确编译并使用

创建文件
ld -dynamic -dylib -arch x86_64 -macosx_version_min 10.10.0 -o libpacket.so obj/SpectrumClient.o obj/socket.o obj/packetCounters.o -lSystem /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/6.1.0/lib/darwin/libclang_rt.osx.a

检查生成的文件是针对 OS X..

~ vamsi$ 文件 libpacket.so

libpacket.so: Mach-O 64 位动态 linked 共享库 x86_64


为了允许 ld 搜索这个,我将 .so 文件移动到 /usr/lib (当我不这样做时,我得到错误 "ld: library not found for -lpacket"。)

为了检查这是否有效,我 运行 命令

ld -lpacket -v

我收到以下错误:


@(#)PROGRAM:ld  PROJECT:ld64-242
configured to support archs: i386 x86_64 x86_64h armv6 armv7 armv7s armv7m armv7k arm64
Library search paths:
    /usr/lib
    /usr/local/lib
Framework search paths:
    /Library/Frameworks/
    /System/Library/Frameworks/
ld: warning: -arch not specified
ld: warning: -macosx_version_min not specified, assuming 10.6
Undefined symbols for architecture x86_64:
  "start", referenced from:
     implicit entry/start for main executable
ld: symbol(s) not found for inferred architecture x86_64

我正在 运行更新 OS X (10.10.5)

即使我指定了体系结构和最低 OS X 版本,为什么我会收到错误消息? 我知道我在这个 .so 文件中没有启动函数,但是当我 link 在其他函数中没有 linked 时。 有人可以指出我做的错误吗?

谢谢。

ld 将您的命令 ld -lpacket 解释为对 link 从指定库中的对象文件执行的完整程序的请求。如果 packet 引用静态库,那将最有意义。

无论如何,您的库不足以构建完整的可执行文件。 linker 正在隐式地寻找 start 例程,但没有找到。 start 例程通常不会出现在您的代码中,它会出现在 C 运行时库中。当你使用编译器驱动link这一步时,编译器指定了C运行时库,它提供了start。但是,C 运行时库依赖于您提供 _main 符号的代码,这样问题就向前推进了一步。

简而言之,ld -lpacket 不是一个明智的 link 命令。你不能 link 只是一个动态库。 linked to 是什么?您希望该命令完成什么?

关于 -arch-macosx_version_min 未指定的其他内容是关于 this link 命令。您在构建库时指定它们的事实是无关紧要的。对于 linker 的这次调用,你迫使 linker 猜测你的意图,所以它告诉你它猜到了什么。

我发现了项目无法 link .so 文件的问题。

在编译“.so”文件时,有额外的配置

-DTARGET_OS_MAC

现在我在 link 将 .so 文件传输到另一个项目时没有收到错误 "Can't find the method..."。

@KenThomases.. 你说得对 "ld -lpacket -v" 命令没有提供任何有用的信息。谢谢!