为什么交叉编译Arm Linux GCC时出错?

为什么交叉编译Arm Linux GCC时出错?,gcc,arm,cross-compiling,embedded-linux,toolchain,Gcc,Arm,Cross Compiling,Embedded Linux,Toolchain,我正在尝试使用AppWeb,我编写了一个非常简单的程序将AppWeb嵌入到我的应用程序中,它使用AppWeb库中的一个函数 #include <appweb/appweb.h> int main(int argc, char** argv) { return maRunWebServer("appweb.conf"); } 为了交叉编译,我将“CC=gcc”替换为“CC=armlinuxgcc”。 我的问题中的错误是: arm-linux-gcc -Wall -Llib -

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

#include <appweb/appweb.h>
int main(int argc, char** argv)
{
    return maRunWebServer("appweb.conf");
}
为了交叉编译,我将“CC=gcc”替换为“CC=armlinuxgcc”。 我的问题中的错误是:

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”中

有人可能会告诉我,为什么会出错?给我一些建议

谢谢,

您必须将appweb头安装(或象征性链接)到arm linux gcc包含树中

例如,我的一个系统的
armlinux 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/

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

您得到的错误是由于编译器(gcc)可以找到您想要包含的文件

最简单的解决方案是更改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"
FLAG = -lappweb -lmpr

当然,您必须将/path/to/my/headers更改为头所在的真实路径。

您有两个问题:

  • 您的include搜索路径(sessyargc.jp和wallyk已经指出)
  • 您的库搜索路径
  • 当您使用
    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-libs,
    arm-linux-gcc
    链接arm-linux-gcc-libs

    即使只是纯文本的标题也不可能相同,因为不同的处理器可以有不同的端号配置、数据大小等

    SO

    在开始编译示例应用程序之前,必须安装针对ARM的AppWeb交叉编译

    在此之后,您将拥有一个可通过工具链访问的
    appweb/appweb.h
    -lappweb

    如果您需要关于如何交叉编译AppWeb的帮助,请告诉我们。
    它必须是源代码中的自述文件,告诉您如何做到这一点。

    您遇到了哪些错误?您确定已将所需库交叉编译并安装在所需位置吗?问题中的错误:未提供错误。啊,很抱歉:D我将错误添加到我的帖子中^^^您的意思是我必须将appweb标头复制到arm linux gcc包含树中?我的arm linux gcc:
    #哪个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?
    FLAG = -lappweb -lmpr -I/path/to/my/headers