簡體   English   中英

將靜態庫鏈接到可執行文件

[英]linking a static library into an executable

我的文件夾結構如下。

--->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)

如果我嘗試files in MyProgram libzint_funciton' in one of the * .c files in libzint_funciton' in one of the包含libzint_funciton' in one of the出現以下錯誤。

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

(答案的第一部分假設OP成功鏈接了他的可執行文件,情況並非如此):

如果您未在任何.c文件中使用該符號,則會發生這種情況。

傳遞.a文件時,鏈接程序選擇在目標文件中引用的內部目標文件。 其他符號將被丟棄。

因此,除非您顯式調用libzint_function ,否則鏈接程序將不包含該符號。

您可以使用各種技術來強制包含符號,而無需從lib中調用任何函數( 在此處說明)

實際問題:

但是在您的情況下,可執行文件已創建,但由於您得到的符號未解決而無效(在編輯問題后會看到該符號)。

這是因為libzint.a文件引用了libpng符號。 您必須安裝該庫(如果尚未安裝)並鏈接到它(當然 libzint.a之后):

@$(CC) $(OBJECTS) -o $(OUTPUTNAME) $(LDFLAGS) libzint.a -lpng

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM