如何强制makefile包含库



我使用Intel_safe_string_lib,它被编译为静态的(这是这个库的一个"问题",它不能像我那样被编译为共享的(。

我制作了一个使用这个intel_safe_string_lib的库,这个库被编译为共享库。

现在我正在创建一个使用我的库的应用程序,在makefile中我包含了我的库和intel库。

但在链接时,make告诉我,在我的库中,找不到对我在库中使用的intel库的函数的引用(/usr/bin/ld:/usr/lib/gcc/x86_64-linux-gnu/8/../../x86_64-linux-gnu/libutils.so:对"strcat_s"libutils.so的未定义引用是我的库(。

现在我在我的应用程序中尝试使用intellib的一个函数(strcat_s(,make进行得很顺利,所以我认为make"认为";如果没有必要,最好不要链接intel库(它在库中是必要的,但在我的应用程序中,如果不是为了测试,就不要链接(。

有一种方法可以";"力";使用图书馆,即使它不是直接需要的?

我在应用程序中临时使用了一个对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不会选择要链接的库,makefile的作者,做了。这不是施加力的问题,但你确实需要告诉make你想要什么。

详细信息取决于您的生成文件和要包含在链接中的库。

更新:

所提供的makefile阐明了问题不在于将库包含在链接中,而在于链接命令的语义。命令行上链接选项的顺序非常重要,尤其是对于静态对象。它们将仅用于满足命令行上在其前面列出的对象的未定义符号。因此,如果libutils对libsafestring有链接依赖关系,那么您可能需要重新排序LIBS变量的值:

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

最新更新