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

标签 c macos static-libraries cross-compiling portability

我想构建一个可移植的静态 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),也会出现警告。

  • 如何为 macOS 构建真正可移植的静态库?如果不可能,有什么办法呢?从同一版本构建的每个主要 macOS 版本有一个不同的版本吗?通过从过时的 Xcode 版本复制 SDK 来进行一些黑客攻击?请记住,我的库是完全可移植的,并且不以任何方式依赖于 macOS 或 stdlib。
  • 编译器三元组末尾的版本部分是否重要?
  • 最佳答案

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

    相关文章:

    c - 在C中获取附近的Wifi

    c - 如何用空格填充字符串

    macos - 使用 Slack 启动 Jenkins 构建

    visual-c++ - 静态库依赖

    c++ - 链接到静态库时出现 "undefined reference"

    c - 这个同步算法是如何工作的?

    swift - 如何从一个 child 扩展到它的第一个 parent ?

    python - 无法使用 pyenv 安装 : `Python may not be configured for Tk` `ModuleNotFoundError: No module named _tkinter' 运行 IDLE

    c - 子 Makefile.am 中的标志

    c - .text 部分中的动态列表