3

我正在尝试使用 AppWeb,并且我编写了一个非常简单的程序来将 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”中

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

谢谢,

4

3 回答 3

2

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

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

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

FLAG = -lappweb -lmpr

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

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

于 2012-01-16T13:26:48.433 回答
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/
于 2012-01-16T08:46:11.540 回答
0

你有两个顾虑:

  1. 您的包含搜索路径(正如 sessyargc.jp 和 wallyk 已经指出的那样)。
  2. 您的图书馆搜索路径。

当您使用 编译时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 的帮助,请告诉我们。它必须是源中的自述文件,告诉如何做到这一点。

于 2012-02-02T16:09:09.967 回答