OSX上的ld命令

时间:2015-09-11 20:40:05

标签: c++ macos linker ld

我想在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 $ file libpacket.so

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

要允许ld搜索此项,我将.so文件移动到 / usr / lib目录 (当我不这样做时,我收到错误“ld:找不到-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文件中没有启动功能,但是当我将其链接到其他功能时,这些功能没有链接。 有人能指出我正在做的错误吗?

谢谢。

1 个答案:

答案 0 :(得分:0)

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

在任何情况下,您的库都不足以构建完整的可执行文件。链接器隐式查找start例程而未找到它。 start例程通常不在您的代码中,它将在C运行时库中。使用编译器驱动链接步骤时,编译器指定C运行时库,它提供start。但是,C运行时库依赖于提供_main符号的代码,因此只需将问题向前移动一步。

简而言之,ld -lpacket不是一个明智的链接命令。您无法仅链接动态库。是什么链接?你期望这个命令能完成什么?

关于-arch-macosx_version_min未指定的其他内容是关于链接命令。在构建库时指定它们的事实是无关紧要的。对于链接器的这种调用,你强迫链接器猜测你想要什么,所以它会告诉你它猜到了什么。