Why error in cross compiling Arm Linux GCC?

£可爱£侵袭症+ 提交于 2020-01-04 05:55:06

问题


I'm trying to use AppWeb, and i wrote a very simple program to embed AppWeb into my application, it's using a function in AppWeb library.

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

I dont know when I compile with gcc (or cc), it compiled successful. But, when I cross compile to Arm architecture, is have been getting error. This is my 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"

I was replace "CC = gcc" to "CC = arm-linux-gcc" in oder to cross compile. The error in my problem is:

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

and i'm sure that the library "libappweb.so" was exist in my folder "lib"

Someone may tell me, why it got error? and give me some advice?

Thanks,


回答1:


Do you know how to use the -I option of gcc?

The error you are getting is due to the fact that the compiler (gcc) can find the files you wanted to include.

Simplest solution would be to change the FLAG in your Makefile:

FLAG = -lappweb -lmpr

to

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

Of course you must change /path/to/my/headers to the true path where your headers reside.




回答2:


You have to install (or symbolically link) the appweb header into the arm-linux-gcc include tree.

For example, the arm-linux-gcc command for one of my systems is

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

So the include files that compiler uses are:

 $ 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/



回答3:


You have two concerns:

  1. Your include search path (as already pointed by sessyargc.jp and wallyk).
  2. Your library search path.

When you compile using gcc, it will use your gcc configurations to find out headers and libraries inside its own toolchain. It will default to something like "/usr/include" and "/usr/lib".

When you are compiling with arm-linux-gcc, as done before by gcc, it will use your arm-linux-gcc configurations to find out headers and libraries inside its own toolchain. It can be anywhere, depending on your toolchain (i.e. "/home/eldk/usr/lib/gcc/arm-linux-gnueabi/4.2.2/..." for wallyk's).

Note that you have two different toolchains, and each one has its own files.

You cannot link a library built for "x86" into an ARM binary. They are incompatible!

gcc links gcc libs, arm-linux-gcc links arm-linux-gcc libs.

Even the headers, that only plain text, can't be the same, as different processors can have different configurations for endiannes, data sizes, etc.

SO

You must install your AppWeb cross-compiled for ARM before getting to compile your sample application.

After this, you will end up having a appweb/appweb.h and -lappweb reachable by your toolchain.

Please tell us if you need help on how to cross-compile AppWeb. It must be a README in the sources telling how to do that.



来源:https://stackoverflow.com/questions/8877359/why-error-in-cross-compiling-arm-linux-gcc

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!