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" 命令没有提供任何有用的信息。谢谢!
我想在 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" 命令没有提供任何有用的信息。谢谢!