【问题标题】:Adapt Makefile for cross-compilation适配 Makefile 进行交叉编译
【发布时间】:2013-06-26 13:43:03
【问题描述】:

当我使用/usr/bin/gcc 编译它时,我有一个可以正常工作的makefile。但是我正在尝试使用 crosstool-ng 编译器对其进行编译。我已将 CC 更改为交叉编译器位置,并在包含编译器的目录中添加了前缀,但编译时出现错误。

Makefile 在这里(抱歉,它很长):

CFLAGS ?= -Wall -O0 -ggdb3
PREFIX = /home/me/crosstool-ng-1.18.0/x-tools/i586-system-linux-gnu/
CC = /home/me/crosstool-ng-1.18.0/x-tools/i586-system-linux-gnu/bin/i586-system-linux-gnu-gcc
ALL_CFLAGS = $(CFLAGS) -D_GNU_SOURCE

.phony: all
all:  food libfood.so.1.0.0 foo_query

.phony: tools
tool tools: libfood_print foo_print

.phony: install
install: libfood.so.1.0.0
    cp libfood.so.1.0.0 $(PREFIX)/lib
cd $(PREFIX)/lib ; \
  ln -sf libfood.so.1.0.0 libfood.so.1 ; \
  ln -sf libfood.so.1 libfood.so
cp libfood.h $(PREFIX)/include
cp foo_data.h $(PREFIX)/include
cp food $(PREFIX)/bin
cp foo_query $(PREFIX)/bin


%.o: %.c
$(CC) $(ALL_CFLAGS) -c $<

food: food.o foo.o
$(CC) $(ALL_CFLAGS) -o $@ $^ -lm -lpthread

libfood.so.1.0.0: libfood.o
$(CC) -shared -Wl,-soname,libfood.so.1 -o libfood.so.1.0.0 libfood.o

libfood_print: libfood_print.o
$(CC) $(ALL_CFLAGS) -o $@ $^ -lfood

foo_print: foo_print.o foo.o
$(CC) $(ALL_CFLAGS) -o $@ $^ -lm -lpthread

foo_query: foo_query.o
$(CC) $(ALL_CFLAGS) -o $@ $^ -lfood

food.o: food.c foo.h foo_data.h
foo.o: foo.c foo.h foo_data.h
foo_print.o: foo_print.c foo_data.h
foo_query.o: foo_query.c foo_data.h
libfood.o: libfood.c libfood.h
$(CC) $(ALL_CFLAGS) -fPIC -c $<

foo_print.o: foo_print.c foo.h

.phony:clean
clean:
rm -rf *.o *~ food libfood.so.1.0.0 foo_print libfood_print foo_query

我收到的错误消息是 cannot find -lfood collect2: ld returned 1 exit status

如果有人能提出解决办法,我将不胜感激。

编辑:我的解决方案:

我可能应该更清楚,但是这个 Makefile 被用来构建一个包含在 buildroot 中的包。我尝试了 Jonatan 的建议,但不幸的是我仍然遇到了同样的错误。我的解决方法是使用make -k 运行buildroot,然后使用make 再次构建。

【问题讨论】:

    标签: c linux makefile cross-compiling


    【解决方案1】:

    解决这个问题的一个简单方法是:

    ALL_CFLAGS += -L$(PREFIX)/lib
    

    如果你真的想在工具链中安装你的lib,你应该寻找usr/lib目录,通常路径是TOOLCHAIN_DIR/TOOLCHAIN_PREFIX/sysroot/usr/lib

    检查$(PREFIX)/lib 目录中的其他二进制文件,您会注意到它们被编译为在您的主机中运行,而不是在您的目标中。

    编译器需要检查依赖关系、链接和在目标中执行的文件安装在sysroot 目录中。

    【讨论】:

      猜你喜欢
      • 2020-07-30
      • 1970-01-01
      • 1970-01-01
      • 2019-01-08
      • 1970-01-01
      • 2013-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多