如何为macOS构建可移植的静态C库

时间:2017-12-05 15:15:15

标签: c macos static-libraries cross-compiling portability

我想构建一个可移植的静态C库,无论macOS版本如何,它都可以链接到macOS二进制文件中。 C库没有任何依赖关系(即没有stdlib,没有OS特定的调用)。唯一的依赖是CPU必须是x86_64。

在提取相关的编译器三元组时,我得到Sierra的x86_64-apple-darwin16.7.0和High Sierra的x86_64-apple-darwin17.2.0。另外,当我在High Sierra上构建时,如果我使用Sierra的静态库(即使我为clang指定--target x86_64-apple-darwin16.7.0),也会发出警告。

  • 如何为macOS构建真正可移植的静态库?如果不可能,那么该怎么办?每个主要macOS版本的一个不同版本是从同一版本构建的吗?从过时的Xcode版本复制SDK有些麻烦吗?请记住,我的库完全可移植,不依赖于macOS或stdlib。

  • 编译器三元组末尾的版本部分是否重要?

1 个答案:

答案 0 :(得分:2)

您可以使用 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。 / p>

nm test在所有三个节目库中静态链接到二进制文件。

希望这有帮助。

上的

P.S。: macosx libtool 与gnu libtool不同,除了名称。完全不同的用法和功能。 macosx libtool本质上是AR + ranlib +一些达尔文主义。