【发布时间】:2020-08-14 15:03:32
【问题描述】:
我使用编译为静态的 Intel_safe_string_lib(这是这个库的“问题”,它不能像我想的那样编译为共享)。
我制作了一个使用这个 intel_safe_string_lib 的库,这个库被编译为共享的。
现在我正在创建一个使用我的库的应用程序,并且在 makefile 中我包含了我的库和 intel 库。
但是在链接时,make 告诉我,在我的库中,找不到对我在库中使用的 intel lib 函数的引用(/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)。
现在我尝试在我的应用程序中使用 intel 库(strcat_s)的功能,make 运行顺利,所以我认为 Make“认为”如果没有必要最好不要链接 intel 库(它是在库中是必需的,但在我的应用程序中不是,如果不是该测试)。
有一种方法可以“强制”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 将正确的标志传达给链接器的问题。 IOW,您不是要让 Make 包含一个库,而是要了解如何让 Make 告诉链接器包含一个库。
-
约翰> 我不这么认为。你能用标准函数将一个字符串附加到另一个字符串,只需要一行代码,比如 safestringlib 中包含的函数吗?不。每次需要检查时,您都必须检查一些东西,这会使代码变得混乱。使用 safestringlib 中包含的函数,您必须使用一行代码,并且这些函数是安全的。
-
当然可以,@MoreBeerPlease。就
strcat_s()做到这一点而言,标准的strcat()函数也能做到这一点。但是,如果您的意思是您认为strcat_s()不需要像strcat()那样关注编码细节,那么您就是在自欺欺人。 -
我红了相当多的文章,他们告诉*_s函数是安全的。当然,如果你用正确的参数使用它们。你能给我一个strcat_s中“错误”的例子吗?