【问题标题】:How to force makefile to include a library如何强制 makefile 包含库
【发布时间】: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中“错误”的例子吗?

标签: gcc makefile


【解决方案1】:

有一种方法可以“强制”Make 使用库,即使它不是直接需要的?

make 不选择要链接的库。 ,makefile 的作者,做。这不是施力的问题,但你需要告诉make你想要什么。

详细信息取决于您的 makefile 以及您要包含在链接中的库。

更新:

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

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

【讨论】:

  • 不,@CiccioPasticcio,他们问如何让make 自动在链接中包含所需的库,或者至少我是这么读的。答案是“你不知道”,上面用略有不同的词表达。至于更普遍地解决 OP 的构建问题,“详细信息取决于您的 makefile 和您要包含在链接中的库”,他们没有提供。
  • 对不起,也许是我的错。正如我所说,我已经在 makefile 中包含了 libsafestring.a 和 libutils.so(我的库),所以它不需要“想象”要包含什么库。我会 makefile 强制包含不“直接”使用的库。我编辑了 makefile 的主要帖子
  • 您的链接命令@MoreBeerPlease 中的库选项顺序可能存在问题,但我们目前无法评估该问题或任何其他替代方案,因为您尚未在问题。如果您想要一个详细的答案,那么我们需要一个详细的问题,包括一个证明问题的minimal reproducible example
  • 我添加了makefile
  • “这不是施力的问题”。搞笑!
猜你喜欢
  • 2012-02-14
  • 2019-07-11
  • 2012-07-05
  • 1970-01-01
  • 1970-01-01
  • 2018-04-04
  • 2016-06-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多