Как собрать переносную статическую библиотеку C для macOS

Я хотел бы создать переносную статическую библиотеку C, которая может быть связана с двоичными файлами macOS независимо от версии macOS. Библиотека C не имеет каких-либо зависимостей (т. Е. Нет stdlib, нет вызовов, специфичных для ОС). Единственная зависимость - это процессор, который должен быть x86_64.

При извлечении соответствующего триплета компилятора я получаю x86_64-apple-darwin16.7.0 для Сьерры и x86_64-apple-darwin17.2.0 для Высокой Сьерры. Кроме того, когда я использую High Sierra, появляется предупреждение, если я использую статическую библиотеку из Sierra (даже когда я указываю --target x86_64-apple-darwin16.7.0 для лязга).

  • Как мне создать действительно переносимую статическую библиотеку для macOS? Если это невозможно, каков путь? Одна и та же версия для каждого основного выпуска MacOS, созданная из того же выпуска? Немного взлома путем копирования SDK из устаревших версий XCode? Имейте в виду, моя библиотека полностью переносима и никак не зависит от macOS или stdlib.

  • Имеет ли значение часть версии в конце триплета компилятора?

1 ответ

Вы можете просто создать статическую библиотеку напрямую, используя macosx libtool

Вот что я только что проверил на 3 разных версиях Mac OS X (Sierra, High Sierra и Mavrick):

$ ls -al

всего 64
drwxr-xr-x  8 сотрудников масуда 272 5 декабря 11:12 .
drwxr-xr-x  7 сотрудников Масуда 238 5 декабря 10:35 ..
-rw-r- r-- 1 персонал Масуд 386 5 декабря 11:11 Makefile
-rwxr-xr-x  1 масудский посох 8464 5 декабря 10:38 бар
-rw-r - r-- 1 масудский персонал 69 5 декабря 11:11 bar.c
-rw-r - r-- 1 масудский персонал 53 5 декабря 11:10 foo.c
-rw-r- r-- 1 масудский персонал 84 5 декабря 11:11 foo.h
-rw-r - r-- 1 масудский персонал 83 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 на всех трех выставках библиотека статически связана в двоичную.

Надеюсь это поможет.

на macosx libtool

PS: macosx libtool НЕ совпадает с gnu libtool, за исключением имени. Совершенно другое использование и функциональность. Macosx libtool - это, по сути, AR + ranlib + некоторые дарвинизмы.

Другие вопросы по тегам