簡體   English   中英

如何強制 makefile 包含庫

[英]How to force makefile to include a library

我使用編譯為 static 的 Intel_safe_string_lib(這是這個庫的一個“問題”,它不能像我想的那樣編譯為共享)。

我制作了一個使用這個 intel_safe_string_lib 的庫,並且這個庫被編譯為共享的。

現在我正在創建一個使用我的庫的應用程序,在 makefile 中,我包含了我的庫和英特爾的庫。

但是在鏈接時,make 告訴我,在我的庫中,找不到對我在庫中使用的 intel lib 的 function 的引用(/usr/bin/ld: /usr/lib/gcc/x86_64- linux-gnu/8/../../../x86_64-linux-gnu/libutils.so: undefined reference to `strcat_s' libutils.so is my library)。

現在我嘗試在我的應用程序中使用英特爾庫(strcat_s)的 function,制作順利,所以我認為 Make“認為”如果沒有必要最好不要鏈接英特爾庫(在庫,但不是,如果不是為了那個測試,在我的應用程序中)。

有一種方法可以“強制” Make 使用庫,即使它不是直接需要的?

我暫時在我的應用程序中使用對 strcat_s 的無用調用來使其編譯,但我會有更優雅的方式。

編輯:這是我的 makefile

TARGET = data_scraper
LIBS = -lpq -llogger -lsafestring -ldaemonizer -lutils
CC = gcc
CFLAGS = -Wall -g -o3

.PHONY: clean all default

default: $(TARGET)
all: default

OBJECTS = $(patsubst %.c, %.o, $(wildcard *.c))
HEADERS = $(wildcard *.h)

%.o: %.c $(HEADERS)
        $(CC) $(CFLAGS)  -c $< -o $@

.PRECIOUS: $(TARGET) $(OBJECTS)

$(TARGET): $(OBJECTS)
       $(CC) $(OBJECTS) $(LIBS) -o $@

clean:
    -rm -f *.o
    -rm -f $(TARGET)

有一種方法可以“強制” Make 使用庫,即使它不是直接需要的?

make不選擇要鏈接的庫。 ,makefile 作者,做。 這不是施加力量的問題,但你確實需要告訴make想要什么。

詳細信息取決於您的 makefile 以及您要包含在鏈接中的庫。

更新:

提出的 makefile 闡明了問題不在於將庫包含在鏈接中,而在於鏈接命令的語義。 命令行上鏈接選項的順序很重要,尤其是對於 static 對象。 它們將用於僅滿足命令行上在它們之前列出的對象的未定義符號。 因此,如果 libutils 對 libsafestring 有鏈接依賴項,那么您可能需要重新排序LIBS變量的值:

LIBS = -lpq -llogger -ldaemonizer -lutils -lsafestring

暫無
暫無

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

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