将静态库链接到可执行文件

时间:2018-01-25 20:56:46

标签: c makefile

我的文件夹结构如下。

--->MyProgram
     | a.c
     | b.c
     | c.c 
     | libzint/

libzint文件夹包含自己的makefile,它在MyProgram文件夹中创建libzint.a。 当我在MyProgram文件夹中调用make时。我希望将libzint.a插入可执行打印机。

如果我这样做

$ nm printer | grep "libzint_function" 

它没有显示任何内容。我做错了什么?

PATHTOMAKEVARIABLES=../
include $(PATHTOMAKEVARIABLES)/Makefile.variable 

PREFIX := /usr

LIBDIR := $(PREFIX)/lib 
LIBDIR2 := .

PRJROOT:=.

INCDIRS := -I. -I./inc/ -I../lib/inc  -I./libzint
ECFLAGS := 

CFLAGS := -DPRN -D_GNU_SOURCE -O2 $(INCDIRS) $(ECFLAGS) 

LDFLAGS := -lrt -lm -lpthread -lclog -fpack-struct -L$(LIBDIR) -L$(LIBDIR2) 


OBJPATH := ./Debug
OUTPUTNAME := printer

SOURCES :=  $(PRJROOT)/src/a.c \
        $(PRJROOT)/src/b.c \
        $(PRJROOT)/src/c.c 

OBJECTS=$(SOURCES:.c=.o)

all: $(OUTPUTNAME)
    @echo "Build complete"

$(OUTPUTNAME) : clean $(OBJECTS) $(LIBZINT)
    @$(CC) $(OBJECTS) -o $(OUTPUTNAME) $(LDFLAGS) libzint.a

LIBZINT:
    $(MAKE) -C libzint

clean:
    @-$(RM) $(OBJECTS)
    @-$(RM) $(PRJROOT)/$(OUTPUTNAME)

如果我尝试添加libzint_funciton' in one of the *。c files in MyProgram`,我会收到以下错误。

libzint.a(png.o): In function `writepng_error_handler':
png.c:(.text+0x40): undefined reference to `png_get_error_ptr'
libzint.a(png.o): In function `png_pixel_plot':
png.c:(.text+0x500): undefined reference to `png_create_write_struct'
png.c:(.text+0x54c): undefined reference to `png_create_info_struct'
png.c:(.text+0x570): undefined reference to `png_destroy_write_struct'
png.c:(.text+0x5cc): undefined reference to `png_destroy_write_struct'
png.c:(.text+0x610): undefined reference to `png_init_io'
png.c:(.text+0x620): undefined reference to `png_set_compression_level'
png.c:(.text+0x670): undefined reference to `png_set_IHDR'
png.c:(.text+0x684): undefined reference to `png_write_info'
png.c:(.text+0x690): undefined reference to `png_set_packing'
png.c:(.text+0x7f4): undefined reference to `png_write_row'
png.c:(.text+0x94c): undefined reference to `png_write_row'
png.c:(.text+0xab0): undefined reference to `png_write_row'
png.c:(.text+0xc08): undefined reference to `png_write_row'
png.c:(.text+0xc38): undefined reference to `png_write_end'
png.c:(.text+0xc64): undefined reference to `png_destroy_write_struct'
collect2: error: ld returned 1 exit status

1 个答案:

答案 0 :(得分:2)

(答案的第一部分假设OP成功链接了他的可执行文件,但事实并非如此):

如果您未在任何$(inputHidden).prop('disabled', true); 文件中使用该符号,则会发生这种情况。

传递.c文件时,链接器会选择目标文件中引用的内部对象文件。其他符号将被丢弃。

因此,除非您明确调用.a,否则链接器不会包含该符号。

您可以强制使用符号,而无需使用各种技术从lib调用任何函数(解释here

实际问题:

在您的情况下,可执行文件已创建,但由于您获得的符号未解析而无效(在您编辑问题后看到)。

这是因为libzint_function文件引用了来自libzint.a的符号。你必须安装该库(如果尚未安装)并链接它(当然 libpng之后):

libzint.a