忽略文件lib.a,文件是为归档而构建的,而不是被链接的体系结构(x86_64)

时间:2013-12-18 16:40:49

标签: c macos gcc

我正在尝试编写printf克隆代码。我已经构建了一个名为“libftprintf.a”的库文件,但是当我尝试使用它时,我在Mac OSX 10.8.5上收到以下错误:

ld: warning: ignoring file ./libftprintf.a, file was built for archive which is not the architecture being linked (x86_64): ./libftprintf.a

奇怪的是,这个工作正常(但我只需要一个名为libftprintf的lib,所以这是不可接受的):

gcc -Wall -Wextra -Werror -I libft/includes/ -o ft_printf_test.bin -L libft -lft -L. -lftprintf ft_printf_test.c

我怀疑我误用ar命令将两个lib链接在一起。但我还没有弄错。

原因可能是什么?

在我尝试将libftprintf.a文件与make test命令一起使用之前,所有内容似乎都可以正常编译。我在Google上搜索了一个解决方案,但大多数答案仅与XCode有关。根据{{​​1}},文件是x86_64。

我的GCC版本:

lipo -info

以下是我的makefile的完整输出,供参考。

$> gcc --version
Configured with: --prefix=/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 5.0 (clang-500.2.79) (based on LLVM 3.3svn)
Target: x86_64-apple-darwin12.5.0
Thread model: posix

3 个答案:

答案 0 :(得分:3)

答案 1 :(得分:2)

我现在发现了一个稍微脏但工作正常的解决方案。我在临时目录中提取libft/libft.a存档。将新库与提取的.o文件链接,然后删除临时目录。

$(NAME): $(OBJ) $(HEADER)
    make -C libft
    mkdir libft_o && cd libft_o && ar -x ../libft/libft.a && cd ..
    $(AR) $(NAME) libft_o/*.o $(OBJ)
    rm -Rf libft_o
    ranlib $(NAME)

缺点是如果某个时候libft中的目标文件与printf文件中的目标文件具有相同的名称,它将覆盖一些东西。但这不太可能发生。

答案 2 :(得分:1)

如果你有胖的架构目标文件,你必须确保将s标志传递给ar。如果没有它,链接器将拒绝获取包含胖架构.o文件的存档文件。例如:

$ ar rcs libprintf.a *.o

然后,您应该看到有关创建“胖档案”的警告。不要担心这一点,这意味着ar将无法更新存档文件,但链接器将能够使用它来正确链接。