我想构建一个可移植的静态 C 库,无论 macOS 版本如何,它都可以链接到 macOS 二进制文件中。 C 库没有任何依赖项(即没有 stdlib,没有特定于操作系统的调用)。唯一的依赖项是必须为 x86_64 的 CPU。
提取相关编译器三元组时,我得到 x86_64-apple-darwin16.7.0
对于 Sierra 和 x86_64-apple-darwin17.2.0
为高塞拉。此外,当我在 High Sierra 上构建时,如果我使用 Sierra 中的静态库(即使我为 clang 指定 --target x86_64-apple-darwin16.7.0
),也会出现警告。
最佳答案
您可以使用 macosx libtool 直接创建静态库
这是我刚刚在 3 个不同版本的 Mac OS X(Sierra、High Sierra 和 Mavrick)上测试的内容:$ ls -al
⏎
total 64 drwxr-xr-x 8 masud staff 272 Dec 5 11:12 . drwxr-xr-x 7 masud staff 238 Dec 5 10:35 .. -rw-r--r-- 1 masud staff 386 Dec 5 11:11 Makefile -rwxr-xr-x 1 masud staff 8464 Dec 5 10:38 bar -rw-r--r-- 1 masud staff 69 Dec 5 11:11 bar.c -rw-r--r-- 1 masud staff 53 Dec 5 11:10 foo.c -rw-r--r-- 1 masud staff 84 Dec 5 11:11 foo.h -rw-r--r-- 1 masud staff 83 Dec 5 11:11 test.c
$ cat Makefile
⏎
LIBTOOL=libtool
STATIC=-static
LIBFOO_A=libfoo.a
SRC=foo.c bar.c
OBJ=$(SRC:.c=.o)
LIBFOOCFLAGS=-mmacosx-version-min=10.1
TESTSRC=test.c
TESTCFLAGS=-mmacosx-version-min=10.7
$(LIBFOO_A): $(OBJ)
$(LIBTOOL) $(STATIC) -o $@ $(OBJ)
%.o: %.c
$(CC) $(LIBFOOCFLAGS) -c -o $@ $<
test: $(LIBFOO_A) test.c
$(CC) $(TESTCFLAGS) -o $@ test.c -L. -lfoo
clean:
$(RM) test $(LIBFOO_A) $(OBJ)
$ cat foo.c
⏎int foo(void) {
volatile int a = 0;
return a;
}
$ cat foo.h
⏎#ifndef __FOO_H
#define __FOO_H
extern int foo(void);
#endif
$ cat bar.c
⏎#include "foo.h"
int bar(int k) {
return k-1;
}
在我的测试中,libfoo.a 可以在任何(三个)平台上生成并复制到任何(三个)平台并用于生成
test
本地。nm test
在所有三个显示库静态链接到二进制文件。希望这可以帮助。
在 macOS 上的 libtool
P.S.:除了名称之外,macosx libtool 与 gnu libtool 不同。完全不同的用法和功能。 macosx libtool 本质上是 AR + ranlib + 一些达尔文主义。
关于c - 如何为 macOS 构建可移植的静态 C 库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47656942/