我创建了一堆.o文件(通过gcc -c $file.c $someotherops -o $file.o)。现在我想把它们链接成一个静态库。 我不确定我是否应该使用ld或gcc来完成这个任务。在ld手册中,它说我不应该直接使用它。但是,我无法弄清楚gcc参数以创建静态库。 我尝试了ld *.o -static -o libfoo.a,但它抱怨缺少很多符号(我认为所有这些符号都来自于libc)。我不明白为什么它会抱怨,因为它应该是一个静态库。我认为它会在我将静态库链接到其他内容时检查这些符号。 还有一件事:我在这里使用/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/ld(我的目标是iOS)。它会发出警告信息ld: warning: using ld_classic。这是什么意思?
然后我想,也许需要指定动态库。所以我添加了
关于
现在,对于每个单独的
而且我仍然有一堆缺失的符号,尤其是:
我查看了一些符号,例如在
在进行更多尝试时,编译静态库时出现了一些警告,提示我使用libtool。现在我正在使用
现在,在编译连接到这个静态库的某些测试应用程序时,我收到了以下警告:
他们是关于什么的?我不使用
此外,这些超出范围的绝对地址是关于什么的?编辑:这些是一些非常大的分配。我现在只是暂时删除了这段代码(如果有人对这些特定的Python内部感兴趣,这是
当我在iPhone上启动它时,我会得到中止:
我解决了PIE禁用和绝对寻址错误。我的Clang命令行中有一个
直到我遇到了另一个关于整数比较的奇怪错误。这似乎更像是他们的Clang构建中的一个错误。
然后我想,也许需要指定动态库。所以我添加了
-lc
来链接libc库。但是它报错:can't locate file for: -lc
。我添加了-L/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk/usr/lib
,并且有一个libc.dylib
。 有什么想法吗?
关于
-lc
错误:我在指定-arch armv6
后,错误消失了。然后它抱怨一个错误的libcache.dylib
(我猜这必须链接自libc.dylib
,因为它没有指定)。添加-L.../usr/lib/system
有所帮助。现在,对于每个单独的
.o
文件,我收到警告ld: warning: CPU_SUBTYPE_ARM_ALL subtype is deprecated
。这是什么意思?而且我仍然有一堆缺失的符号,尤其是:
Undefined symbols for architecture armv6:
"start", referenced from:
-u command line option
(maybe you meant: _PyThread_start_new_thread)
"___udivsi3", referenced from:
_get_len_of_range in bltinmodule.o
_quorem in dtoa.o
_array_resize in arraymodule.o
_newarrayobject in arraymodule.o
_array_fromfile in arraymodule.o
_get_len_of_range in rangeobject.o
_inplace_divrem1 in longobject.o
...
"___unorddf2", referenced from:
_builtin_round in bltinmodule.o
...
我查看了一些符号,例如在
get_len_of_range
函数中的___udivsi3
。该函数仅使用C算术,没有外部调用。因此,似乎要使用一些外部函数,例如___udivsi3
。但是这是在哪些库中?
-lgcc_s.1
修复了大部分___udivsi3
和相关的缺失符号。但是start
符号仍然缺失。-u命令行选项
是什么意思?
我从这里得到的感觉是,也许ld
不是合适的工具。在那里,只使用了一个简单的调用ar
。这似乎更有意义。我将检查它是否有效,并将其转化为答案。
在进行更多尝试时,编译静态库时出现了一些警告,提示我使用libtool。现在我正在使用
libtool -static -o libfoo.a *.o
。同时,我将编译器切换到了/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang
,但不确定是否有影响。现在,在编译连接到这个静态库的某些测试应用程序时,我收到了以下警告:
ld: warning: PIE disabled. Absolute addressing (perhaps -mdynamic-no-pic) not allowed in code signed PIE, but used in __PyBuiltin_Init from /Users/az/Programmierung/python-embedded/libpython.a(bltinmodule.o). To fix this warning, don't compile with -mdynamic-no-pic or link with -Wl,-no_pie
ld: warning: 32-bit absolute address out of range (0x1001B70C4 max is 4GB): from _usedpools + 0x00000004 (0x001B70CC) to 0x1001B70C4
ld: warning: 32-bit absolute address out of range (0x1001B70C4 max is 4GB): from _usedpools + 0x00000000 (0x001B70CC) to 0x1001B70C4
他们是关于什么的?我不使用
-mdynamic-no-pic
。我也不太清楚在_PyBuiltin_Init
中如何使用绝对寻址。此外,这些超出范围的绝对地址是关于什么的?编辑:这些是一些非常大的分配。我现在只是暂时删除了这段代码(如果有人对这些特定的Python内部感兴趣,这是
WITH_PYMALLOC
)。当我在iPhone上启动它时,我会得到中止:
dyld: vm_protect(0x00001000, 0x00173000, false, 0x07) failed, result=2 for segment __TEXT in /var/mobile/Applications/C15D9525-E7DC-4463-B05B-D39C9CA24319/...
当我使用-no_pie
进行链接时,甚至无法链接。它失败了:
在armv7架构下,/Users/az/Programmierung/python-embedded/libpython.a(marshal.o)中的_read_object向/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/usr/lib/libSystem.dylib的___stderrp进行了非法文本重定位
我解决了PIE禁用和绝对寻址错误。我的Clang命令行中有一个
-static
。一旦我删除了它,警告消失了,dyld/vm_protect错误也消失了。这是第一次实际运行了一些代码。直到我遇到了另一个关于整数比较的奇怪错误。这似乎更像是他们的Clang构建中的一个错误。