2015-04-13 202 views
0

对于这个可能看起来微不足道的问题感到抱歉,但是我看了一些教程和SO问题,仍然无法弄清楚什么是错误的。Makefile链接器无法在静态库中找到函数

无论如何,当使用gcc时,链接器无法在我所包含的静态库中找到函数。

错误消息:

arm-none-linux-gnueabi-gcc -I. -I./include yuv.c -c -o yuv.o 
arm-none-linux-gnueabi-gcc -I. -I./include main.c -c -o main.o 
arm-none-linux-gnueabi-gcc -L./lib -I. -I./include yuv.o main.o -lpthread -lrt -ljpeg -o grab.elf 
main.o: In function `jpegWrite': 
main.c:(.text+0x118): undefined reference to `jpeg_std_error' 
main.c:(.text+0x134): undefined reference to `jpeg_CreateCompress' 
main.c:(.text+0x144): undefined reference to `jpeg_stdio_dest' 
main.c:(.text+0x17c): undefined reference to `jpeg_set_defaults' 
main.c:(.text+0x198): undefined reference to `jpeg_set_quality' 
main.c:(.text+0x1a8): undefined reference to `jpeg_start_compress' 
main.c:(.text+0x1e4): undefined reference to `jpeg_write_scanlines' 
main.c:(.text+0x200): undefined reference to `jpeg_finish_compress' 
main.c:(.text+0x20c): undefined reference to `jpeg_destroy_compress' 
collect2: ld returned 1 exit status 
make: *** [grab.elf] Error 1 

我的文件结构如下:

生成文件

的main.c

  • 在文件夹中的lib

  • libjpeg.a

我的Makefile中写道:

GCC=gcc 

INC_PATH= -I. -I./include 

LIBS_PATH = -L./lib 

HEADER_FILE=./yuv.h ./include/jpeglib.h 

grab.elf: yuv.o main.o 
    $(CROSS_COMPILE)$(GCC) $(LIBS_PATH) $(INC_PATH) yuv.o main.o -lpthread -lrt -ljpeg -o grab.elf 

yuv.o:yuv.c $(HEADER_FILE) 
    $(CROSS_COMPILE)$(GCC) $(INC_PATH) yuv.c -c -o yuv.o 

main.o:main.c $(HEADER_FILE) 
    $(CROSS_COMPILE)$(GCC) $(INC_PATH) main.c -c -o main.o 

我也试过:

nm libjpeg.a | grep jpeg_std 
000001f0 T _jpeg_stdio_dest 
00000140 T _jpeg_stdio_src 
000001f0 T _jpeg_std_error 
000012c0 R _jpeg_std_message_table 

是否有任何类型的灵魂关心帮助我吗?谢谢。

+1

可能是一些线索在这里http://stackoverflow.com/questions/1034852/adding-leading-underscores-to-assembly-symbols-with-gcc-on-win32 –

回答

1

难道是libjpeg.a是在你开发的平台上编译的,而grab.elf的目标是不同的?即您正在x86环境中开发并定位ARM?

+0

谢谢,问题是libjpeg.a编译对于x86,但main.o是为ARM编译的。问题是通过使用为ARM编译的另一个libjpeg.a解决的。 – shock