跨编译 Arm Linux GCC 时为什么会出错?

3

我正在尝试使用AppWeb,并编写了一个非常简单的程序将其嵌入到我的应用程序中,它使用了AppWeb库中的一个函数。

#include <appweb/appweb.h>
int main(int argc, char** argv)
{
    return maRunWebServer("appweb.conf");
}

我不知道为什么使用gcc(或cc)编译时,编译成功。但是,当我交叉编译到Arm架构时,出现了错误。 这是我的Makefile:

CC = gcc

LIBS = lib

FLAG = -lappweb -lmpr

TEST_TARGET = embed-appweb
OBJS = embed-appweb

all: clean compile

compile: run
    $(CC) -Wall -L$(LIBS) $(FLAG) -o $(TEST_TARGET) $(OBJS).o

run:
    $(CC) -Wall -L$(LIBS) $(FLAG) -c $(OBJS).c

clean:
    @rm -rf $(TEST_TARGET) $(TEST_TARGET).trc *.o *~
    @echo "Clean complete"

我将"CC = gcc"替换为"CC = arm-linux-gcc"以进行交叉编译。

我的问题出错了:

arm-linux-gcc -Wall -Llib -lappweb -lmpr -c embed-appweb.c
embed-appweb.c:1:27: error: appweb/appweb.h: No such file or directory
embed-appweb.c: In function 'main':
embed-appweb.c:4: warning: implicit declaration of function 'maRunWebServer'
make: *** [run] Error 1

我相信库文件"libappweb.so"存在于我的"lib"文件夹中。

有人可能会问,为什么会出现错误?能否给我一些建议?

谢谢。


1
你遇到了什么错误?你确定你已经交叉编译并安装了所需的库到指定的位置吗? - Basile Starynkevitch
问题中的错误:未提供错误。 - leppie
啊,对不起:D 我把我的错误加到了我的帖子里^^ - TidusLe
3个回答

2

你知道如何使用gcc的-I选项吗?

你遇到的错误是由于编译器(gcc)找不到你想要包含的文件。

最简单的解决方案是在你的Makefile中更改FLAG:

FLAG = -lappweb -lmpr

to

FLAG = -lappweb -lmpr -I/path/to/my/headers

当然,您必须将“/path/to/my/headers”更改为实际文件头所在的路径。

1

您需要将appweb头文件安装(或符号链接)到arm-linux-gcc的包含目录中。

例如,我的某个系统的arm-linux-gcc命令为:

$ which arm-linux-gcc
/home/eldk/usr/bin/arm-linux-gcc

因此,编译器使用的包含文件是:

 $ arm-linux-gcc -print-search-dirs
install: /home/eldk/usr/lib/gcc/arm-linux-gnueabi/4.2.2/
programs: =/home/eldk/usr/bin/../libexec/gcc/arm-linux-gnueabi/4.2.2/:/home/eldk/usr/bin/../libexec/gcc/:/home/eldk/usr/lib/gcc/arm-linux-gnueabi/4.2.2/:/home/eldk/usr/lib/gcc/arm-linux-gnueabi/4.2.2/:/home/eldk/usr/lib/gcc/arm-linux-gnueabi/:/usr/libexec/gcc/arm-linux-gnueabi/4.2.2/:/usr/libexec/gcc/arm-linux-gnueabi/:/home/eldk/usr/libexec/gcc/arm-linux-gnueabi/4.2.2/:/home/eldk/usr/bin/../lib/gcc/arm-linux-gnueabi/4.2.2/../../../../arm-linux-gnueabi/bin/arm-linux-gnueabi/4.2.2/:/home/eldk/usr/bin/../lib/gcc/arm-linux-gnueabi/4.2.2/../../../../arm-linux-gnueabi/bin/:/home/eldk/usr/lib/gcc/arm-linux-gnueabi/4.2.2/../../../../arm-linux-gnueabi/bin/arm-linux-gnueabi/4.2.2/:/home/eldk/usr/lib/gcc/arm-linux-gnueabi/4.2.2/../../../../arm-linux-gnueabi/bin/
libraries: =/home/eldk/usr/bin/../lib/gcc/arm-linux-gnueabi/4.2.2/:/home/eldk/usr/bin/../lib/gcc/:/home/eldk/usr/lib/gcc/arm-linux-gnueabi/4.2.2/:/usr/libexec/gcc/arm-linux-gnueabi/4.2.2/:/home/eldk/usr/bin/../lib/gcc/arm-linux-gnueabi/4.2.2/../../../../arm-linux-gnueabi/lib/arm-linux-gnueabi/4.2.2/:/home/eldk/usr/bin/../lib/gcc/arm-linux-gnueabi/4.2.2/../../../../arm-linux-gnueabi/lib/:/home/eldk/usr/lib/gcc/arm-linux-gnueabi/4.2.2/../../../../arm-linux-gnueabi/lib/arm-linux-gnueabi/4.2.2/:/home/eldk/usr/lib/gcc/arm-linux-gnueabi/4.2.2/../../../../arm-linux-gnueabi/lib/:/home/eldk/usr/../arm/lib/arm-linux-gnueabi/4.2.2/:/home/eldk/usr/../arm/lib/:/home/eldk/usr/../arm/usr/lib/arm-linux-gnueabi/4.2.2/:/home/eldk/usr/../arm/usr/lib/

你的意思是我需要将appweb头文件复制到arm-linux-gcc的include目录下吗? 我的arm-linux-gcc路径为: /media/Learning/Embedded-Systems/Soft/gcc-4.3.2/local/arm/4.3.2/bin/arm-linux-gcc 或者我该如何将appweb头文件链接到arm-linux-gcc呢? - TidusLe

0

你有两个问题:

  1. 你的包含文件搜索路径(如sessyargc.jp和wallyk所指出的)。
  2. 你的库搜索路径。

当你使用 gcc 编译时,它会使用gcc配置来查找头文件和库文件,这些文件位于gcc自己的工具链中。它将默认为类似于“/usr/include”和“/usr/lib”的路径。

当你使用 arm-linux-gcc 编译时,与使用 gcc 一样,它将使用你的 arm-linux-gcc 配置来查找头文件和库文件,这些文件位于其自己的工具链中。这个路径可以是任何地方,取决于你的工具链(例如wallyk的路径可能是“/home/eldk/usr/lib/gcc/arm-linux-gnueabi/4.2.2/...”)。

请注意,你有两个不同的工具链,每个都有自己的文件。

你不能将为“x86”构建的库链接到ARM二进制文件中。它们是不兼容的!

gcc 链接 gcc 库,arm-linux-gcc 链接 arm-linux-gcc 库。

即使是只有纯文本的标题,也不能相同,因为不同的处理器可能有不同的字节序、数据大小等配置。
请务必在编译示例应用程序之前安装适用于ARM架构的AppWeb。
完成后,您将拥有一个可通过工具链访问的`appweb/appweb.h`和`-lappweb`。
如果您需要有关如何交叉编译AppWeb的帮助,请告诉我们。 源代码中一定有一份说明如何进行交叉编译的README文件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接