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

我正在尝试编写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有关。 根据lipo -info ,文件是x86_64。

我的GCC版本:

 $> 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 

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

 $> make re make -C libft clean rm -f src/ft_arrdel.o src/ft_atoi.o src/ft_bzero.o src/ft_isalnum.o src/ft_isalpha.o src/ft_isascii.o src/ft_isdigit.o src/ft_islower.o src/ft_isprint.o src/ft_isupper.o src/ft_itoa.o src/ft_lstadd.o src/ft_lstdel.o src/ft_lstdelone.o src/ft_lstiter.o src/ft_lstmap.o src/ft_lstnew.o src/ft_lstpush.o src/ft_malloc.o src/ft_memalloc.o src/ft_memccpy.o src/ft_memchr.o src/ft_memcmp.o src/ft_memcpy.o src/ft_memdel.o src/ft_memmove.o src/ft_memset.o src/ft_putchar.o src/ft_putchar_fd.o src/ft_putendl.o src/ft_putendl_fd.o src/ft_putnbr.o src/ft_putnbr_fd.o src/ft_putstr.o src/ft_putstr_fd.o src/ft_strcat.o src/ft_strchr.o src/ft_strclr.o src/ft_strcmp.o src/ft_strcpy.o src/ft_strdel.o src/ft_strdup.o src/ft_strequ.o src/ft_striter.o src/ft_striteri.o src/ft_strjoin.o src/ft_strlcat.o src/ft_strlen.o src/ft_strmap.o src/ft_strmapi.o src/ft_strncat.o src/ft_strncmp.o src/ft_strncpy.o src/ft_strnequ.o src/ft_strnew.o src/ft_strnstr.o src/ft_strrchr.o src/ft_strrev.o src/ft_strsplit.o src/ft_strstr.o src/ft_strsub.o src/ft_strtrim.o src/ft_tolower.o src/ft_toupper.o src/get_next_line.o rm -f ft_printf.o make -C libft fclean rm -f src/ft_arrdel.o src/ft_atoi.o src/ft_bzero.o src/ft_isalnum.o src/ft_isalpha.o src/ft_isascii.o src/ft_isdigit.o src/ft_islower.o src/ft_isprint.o src/ft_isupper.o src/ft_itoa.o src/ft_lstadd.o src/ft_lstdel.o src/ft_lstdelone.o src/ft_lstiter.o src/ft_lstmap.o src/ft_lstnew.o src/ft_lstpush.o src/ft_malloc.o src/ft_memalloc.o src/ft_memccpy.o src/ft_memchr.o src/ft_memcmp.o src/ft_memcpy.o src/ft_memdel.o src/ft_memmove.o src/ft_memset.o src/ft_putchar.o src/ft_putchar_fd.o src/ft_putendl.o src/ft_putendl_fd.o src/ft_putnbr.o src/ft_putnbr_fd.o src/ft_putstr.o src/ft_putstr_fd.o src/ft_strcat.o src/ft_strchr.o src/ft_strclr.o src/ft_strcmp.o src/ft_strcpy.o src/ft_strdel.o src/ft_strdup.o src/ft_strequ.o src/ft_striter.o src/ft_striteri.o src/ft_strjoin.o src/ft_strlcat.o src/ft_strlen.o src/ft_strmap.o src/ft_strmapi.o src/ft_strncat.o src/ft_strncmp.o src/ft_strncpy.o src/ft_strnequ.o src/ft_strnew.o src/ft_strnstr.o src/ft_strrchr.o src/ft_strrev.o src/ft_strsplit.o src/ft_strstr.o src/ft_strsub.o src/ft_strtrim.o src/ft_tolower.o src/ft_toupper.o src/get_next_line.o rm -f libft.a rm -f libftprintf.a rm -Rf ft_printf_test.bin* gcc -Wall -Wextra -Werror -I libft/includes/ -c ft_printf.c -o ft_printf.o make -C libft gcc -g -Wall -Wextra -Werror -I includes -c src/ft_arrdel.c -o src/ft_arrdel.o gcc -g -Wall -Wextra -Werror -I includes -c src/ft_atoi.c -o src/ft_atoi.o gcc -g -Wall -Wextra -Werror -I includes -c src/ft_bzero.c -o src/ft_bzero.o gcc -g -Wall -Wextra -Werror -I includes -c src/ft_isalnum.c -o src/ft_isalnum.o gcc -g -Wall -Wextra -Werror -I includes -c src/ft_isalpha.c -o src/ft_isalpha.o gcc -g -Wall -Wextra -Werror -I includes -c src/ft_isascii.c -o src/ft_isascii.o gcc -g -Wall -Wextra -Werror -I includes -c src/ft_isdigit.c -o src/ft_isdigit.o gcc -g -Wall -Wextra -Werror -I includes -c src/ft_islower.c -o src/ft_islower.o gcc -g -Wall -Wextra -Werror -I includes -c src/ft_isprint.c -o src/ft_isprint.o gcc -g -Wall -Wextra -Werror -I includes -c src/ft_isupper.c -o src/ft_isupper.o gcc -g -Wall -Wextra -Werror -I includes -c src/ft_itoa.c -o src/ft_itoa.o gcc -g -Wall -Wextra -Werror -I includes -c src/ft_lstadd.c -o src/ft_lstadd.o gcc -g -Wall -Wextra -Werror -I includes -c src/ft_lstdel.c -o src/ft_lstdel.o gcc -g -Wall -Wextra -Werror -I includes -c src/ft_lstdelone.c -o src/ft_lstdelone.o gcc -g -Wall -Wextra -Werror -I includes -c src/ft_lstiter.c -o src/ft_lstiter.o gcc -g -Wall -Wextra -Werror -I includes -c src/ft_lstmap.c -o src/ft_lstmap.o gcc -g -Wall -Wextra -Werror -I includes -c src/ft_lstnew.c -o src/ft_lstnew.o gcc -g -Wall -Wextra -Werror -I includes -c src/ft_lstpush.c -o src/ft_lstpush.o gcc -g -Wall -Wextra -Werror -I includes -c src/ft_malloc.c -o src/ft_malloc.o gcc -g -Wall -Wextra -Werror -I includes -c src/ft_memalloc.c -o src/ft_memalloc.o gcc -g -Wall -Wextra -Werror -I includes -c src/ft_memccpy.c -o src/ft_memccpy.o gcc -g -Wall -Wextra -Werror -I includes -c src/ft_memchr.c -o src/ft_memchr.o gcc -g -Wall -Wextra -Werror -I includes -c src/ft_memcmp.c -o src/ft_memcmp.o gcc -g -Wall -Wextra -Werror -I includes -c src/ft_memcpy.c -o src/ft_memcpy.o gcc -g -Wall -Wextra -Werror -I includes -c src/ft_memdel.c -o src/ft_memdel.o gcc -g -Wall -Wextra -Werror -I includes -c src/ft_memmove.c -o src/ft_memmove.o gcc -g -Wall -Wextra -Werror -I includes -c src/ft_memset.c -o src/ft_memset.o gcc -g -Wall -Wextra -Werror -I includes -c src/ft_putchar.c -o src/ft_putchar.o gcc -g -Wall -Wextra -Werror -I includes -c src/ft_putchar_fd.c -o src/ft_putchar_fd.o gcc -g -Wall -Wextra -Werror -I includes -c src/ft_putendl.c -o src/ft_putendl.o gcc -g -Wall -Wextra -Werror -I includes -c src/ft_putendl_fd.c -o src/ft_putendl_fd.o gcc -g -Wall -Wextra -Werror -I includes -c src/ft_putnbr.c -o src/ft_putnbr.o gcc -g -Wall -Wextra -Werror -I includes -c src/ft_putnbr_fd.c -o src/ft_putnbr_fd.o gcc -g -Wall -Wextra -Werror -I includes -c src/ft_putstr.c -o src/ft_putstr.o gcc -g -Wall -Wextra -Werror -I includes -c src/ft_putstr_fd.c -o src/ft_putstr_fd.o gcc -g -Wall -Wextra -Werror -I includes -c src/ft_strcat.c -o src/ft_strcat.o gcc -g -Wall -Wextra -Werror -I includes -c src/ft_strchr.c -o src/ft_strchr.o gcc -g -Wall -Wextra -Werror -I includes -c src/ft_strclr.c -o src/ft_strclr.o gcc -g -Wall -Wextra -Werror -I includes -c src/ft_strcmp.c -o src/ft_strcmp.o gcc -g -Wall -Wextra -Werror -I includes -c src/ft_strcpy.c -o src/ft_strcpy.o gcc -g -Wall -Wextra -Werror -I includes -c src/ft_strdel.c -o src/ft_strdel.o gcc -g -Wall -Wextra -Werror -I includes -c src/ft_strdup.c -o src/ft_strdup.o gcc -g -Wall -Wextra -Werror -I includes -c src/ft_strequ.c -o src/ft_strequ.o gcc -g -Wall -Wextra -Werror -I includes -c src/ft_striter.c -o src/ft_striter.o gcc -g -Wall -Wextra -Werror -I includes -c src/ft_striteri.c -o src/ft_striteri.o gcc -g -Wall -Wextra -Werror -I includes -c src/ft_strjoin.c -o src/ft_strjoin.o gcc -g -Wall -Wextra -Werror -I includes -c src/ft_strlcat.c -o src/ft_strlcat.o gcc -g -Wall -Wextra -Werror -I includes -c src/ft_strlen.c -o src/ft_strlen.o gcc -g -Wall -Wextra -Werror -I includes -c src/ft_strmap.c -o src/ft_strmap.o gcc -g -Wall -Wextra -Werror -I includes -c src/ft_strmapi.c -o src/ft_strmapi.o gcc -g -Wall -Wextra -Werror -I includes -c src/ft_strncat.c -o src/ft_strncat.o gcc -g -Wall -Wextra -Werror -I includes -c src/ft_strncmp.c -o src/ft_strncmp.o gcc -g -Wall -Wextra -Werror -I includes -c src/ft_strncpy.c -o src/ft_strncpy.o gcc -g -Wall -Wextra -Werror -I includes -c src/ft_strnequ.c -o src/ft_strnequ.o gcc -g -Wall -Wextra -Werror -I includes -c src/ft_strnew.c -o src/ft_strnew.o gcc -g -Wall -Wextra -Werror -I includes -c src/ft_strnstr.c -o src/ft_strnstr.o gcc -g -Wall -Wextra -Werror -I includes -c src/ft_strrchr.c -o src/ft_strrchr.o gcc -g -Wall -Wextra -Werror -I includes -c src/ft_strrev.c -o src/ft_strrev.o gcc -g -Wall -Wextra -Werror -I includes -c src/ft_strsplit.c -o src/ft_strsplit.o gcc -g -Wall -Wextra -Werror -I includes -c src/ft_strstr.c -o src/ft_strstr.o gcc -g -Wall -Wextra -Werror -I includes -c src/ft_strsub.c -o src/ft_strsub.o gcc -g -Wall -Wextra -Werror -I includes -c src/ft_strtrim.c -o src/ft_strtrim.o gcc -g -Wall -Wextra -Werror -I includes -c src/ft_tolower.c -o src/ft_tolower.o gcc -g -Wall -Wextra -Werror -I includes -c src/ft_toupper.c -o src/ft_toupper.o gcc -g -Wall -Wextra -Werror -I includes -c src/get_next_line.c -o src/get_next_line.o ar -rsv libft.a src/ft_arrdel.o src/ft_atoi.o src/ft_bzero.o src/ft_isalnum.o src/ft_isalpha.o src/ft_isascii.o src/ft_isdigit.o src/ft_islower.o src/ft_isprint.o src/ft_isupper.o src/ft_itoa.o src/ft_lstadd.o src/ft_lstdel.o src/ft_lstdelone.o src/ft_lstiter.o src/ft_lstmap.o src/ft_lstnew.o src/ft_lstpush.o src/ft_malloc.o src/ft_memalloc.o src/ft_memccpy.o src/ft_memchr.o src/ft_memcmp.o src/ft_memcpy.o src/ft_memdel.o src/ft_memmove.o src/ft_memset.o src/ft_putchar.o src/ft_putchar_fd.o src/ft_putendl.o src/ft_putendl_fd.o src/ft_putnbr.o src/ft_putnbr_fd.o src/ft_putstr.o src/ft_putstr_fd.o src/ft_strcat.o src/ft_strchr.o src/ft_strclr.o src/ft_strcmp.o src/ft_strcpy.o src/ft_strdel.o src/ft_strdup.o src/ft_strequ.o src/ft_striter.o src/ft_striteri.o src/ft_strjoin.o src/ft_strlcat.o src/ft_strlen.o src/ft_strmap.o src/ft_strmapi.o src/ft_strncat.o src/ft_strncmp.o src/ft_strncpy.o src/ft_strnequ.o src/ft_strnew.o src/ft_strnstr.o src/ft_strrchr.o src/ft_strrev.o src/ft_strsplit.o src/ft_strstr.o src/ft_strsub.o src/ft_strtrim.o src/ft_tolower.o src/ft_toupper.o src/get_next_line.o ar: creating archive libft.a a - src/ft_arrdel.o a - src/ft_atoi.o a - src/ft_bzero.o a - src/ft_isalnum.o a - src/ft_isalpha.o a - src/ft_isascii.o a - src/ft_isdigit.o a - src/ft_islower.o a - src/ft_isprint.o a - src/ft_isupper.o a - src/ft_itoa.o a - src/ft_lstadd.o a - src/ft_lstdel.o a - src/ft_lstdelone.o a - src/ft_lstiter.o a - src/ft_lstmap.o a - src/ft_lstnew.o a - src/ft_lstpush.o a - src/ft_malloc.o a - src/ft_memalloc.o a - src/ft_memccpy.o a - src/ft_memchr.o a - src/ft_memcmp.o a - src/ft_memcpy.o a - src/ft_memdel.o a - src/ft_memmove.o a - src/ft_memset.o a - src/ft_putchar.o a - src/ft_putchar_fd.o a - src/ft_putendl.o a - src/ft_putendl_fd.o a - src/ft_putnbr.o a - src/ft_putnbr_fd.o a - src/ft_putstr.o a - src/ft_putstr_fd.o a - src/ft_strcat.o a - src/ft_strchr.o a - src/ft_strclr.o a - src/ft_strcmp.o a - src/ft_strcpy.o a - src/ft_strdel.o a - src/ft_strdup.o a - src/ft_strequ.o a - src/ft_striter.o a - src/ft_striteri.o a - src/ft_strjoin.o a - src/ft_strlcat.o a - src/ft_strlen.o a - src/ft_strmap.o a - src/ft_strmapi.o a - src/ft_strncat.o a - src/ft_strncmp.o a - src/ft_strncpy.o a - src/ft_strnequ.o a - src/ft_strnew.o a - src/ft_strnstr.o a - src/ft_strrchr.o a - src/ft_strrev.o a - src/ft_strsplit.o a - src/ft_strstr.o a - src/ft_strsub.o a - src/ft_strtrim.o a - src/ft_tolower.o a - src/ft_toupper.o a - src/get_next_line.o ar -rsv libftprintf.a libft/libft.a ft_printf.o ar: creating archive libftprintf.a a - libft/libft.a a - ft_printf.o ranlib libftprintf.a $> make test gcc -Wall -Wextra -Werror -I libft/includes/ -L. -lftprintf -o ft_printf_test.bin ft_printf_test.c ld: warning: ignoring file ./libftprintf.a, file was built for archive which is not the architecture being linked (x86_64): ./libftprintf.a Undefined symbols for architecture x86_64: "_ft_printf_string", referenced from: _test_printf_percent in ft_printf_test-jTXeph.o "_ft_strcmp", referenced from: _test_printf_percent in ft_printf_test-jTXeph.o ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation) make: *** [test] Error 1 [ ckleines ~/Projects/2013-2014/Algo-1/printf ] $> lipo -info libft/libft.a input file libft/libft.a is not a fat file Non-fat file: libft/libft.a is architecture: x86_64 [ ckleines ~/Projects/2013-2014/Algo-1/printf ] $> lipo -info libftprintf.a input file libftprintf.a is not a fat file Non-fat file: libftprintf.a is architecture: x86_64 [ ckleines ~/Projects/2013-2014/Algo-1/printf ] $> lipo -info ft_printf.o Non-fat file: ft_printf.o is architecture: x86_64 

我现在发现了一个稍微脏但工作正常的解决方案。 我在一个临时目录中提取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文件中的目标文件具有相同的名称,它将覆盖所有内容。 但这不太可能发生。

使用libtool -static -o而不是ar

Mac OS X的静态库链接问题:找不到架构x86_64的符号

如果您有胖的体系结构对象文件,则必须确保将s标志传递给ar 。 没有它,链接器将拒绝接收包含胖架构.o文件的存档文件。 例如:

 $ ar rcs libprintf.a *.o 

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