我正在尝试编写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
答案 0 :(得分:3)
使用libtool -static -o
代替ar
。
Static library link issue with Mac OS X: symbol(s) not found for architecture x86_64
答案 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
将无法更新存档文件,但链接器将能够使用它来正确链接。