【问题标题】:`make` not linking locally installed library automatically (CS50x's cs50.h)`make` 不会自动链接本地安装的库(CS50x 的 cs50.h)
【发布时间】:2020-11-03 23:07:20
【问题描述】:

我正在尝试在我的 Gentoo 系统上复制 CS50x's 沙盒,但在运行 make 时出现这种错误

% make price
cc     price.c   -o price
/usr/lib/gcc/x86_64-pc-linux-gnu/9.3.0/../../../../x86_64-pc-linux-gnu/bin/ld: /tmp/cc9TASaL.o: in function `main':
price.c:(.text+0x15): undefined reference to `get_float'
collect2: error: ld returned 1 exit status
make: *** [<builtin>: price] Error 1

供参考,这是源文件:

% cat price.c
#include <stdio.h>
#include <cs50.h>

int main(void)
{
    float price = get_float("What's the price?\n");
    printf("Your total is %.2f (VAT included)\n", price * 1.22);
}

我已经在我的系统上手动安装了 libcs​​50:

# ldconfig -p | grep cs50 
libcs50.so.10 (libc6,x86-64) => /usr/local/lib64/libcs50.so.10
libcs50.so (libc6,x86-64) => /usr/local/lib64/libcs50.so

当我编译文件时

% gcc -lcs50 price.c -o price

我没有收到任何错误。 我是否在我的系统上配置了错误,或者我误解了make 的工作原理? 看完讲座后,我的印象是make会“自动”添加-lcs50参数。

谢谢!

解决方案 根据以下说明设置CCCFLAGSLDLIBShttps://cs50.readthedocs.io/libraries/cs50/c/。 由于这些环境变量,讲座视频中的所有“自动”内容都是可能的。

【问题讨论】:

  • 它怎么知道如何“神奇地”添加一些随机库? (即,不,它不会那样做)。
  • 我以为它会添加它。因为我已经在我的系统中安装了这个库,并且我用 #include &lt;cs50.h&gt; 调用了它。在这一点上,我认为讲师必须在他的沙箱中配置了一些额外的东西,因为他在没有 Makefile 或其他参数的情况下运行make,并且编译良好。我想知道是否有一种常用的方法来复制它?
  • 由于不同的原因,您的系统上可能至少安装了 1,000 个不同的库(快速回顾显示在我的系统上安装了 1,400 个lib* 包); make 将它们全部添加到每个链接行肯定是不正确的。至于#include,首先 make 根本不解析您的源代码,其次它无法可靠地将包含文件名映射到库:没有理由它们将或应该具有相同的名称;许多人没有。
  • 至于你的导师是怎么做到的,如果他真的没有makefile,那么他一定有一个环境变量集,比如他的shell设置文件中的export LDLIBS='-lcs50'~/.bashrc)。你确定他没有makefile吗?那肯定是不寻常的。将其保留在环境中并不是一个好主意,因为它适用于您运行的任何方式。
  • 错误是在 makefile 中,你忘记在那儿链接库。你能发布makefile吗?

标签: makefile compiler-errors compilation gnu-make cs50


【解决方案1】:

Make 有一个内置规则,可以从单个 .c 文件构建可执行文件:

%: %.c
#  recipe to execute (built-in):
    $(LINK.c) $^ $(LOADLIBES) $(LDLIBS) -o $@

这样您就不必为像这样的大多数简单任务编写 Makefile。
您可以使用make -p | grep -C 3 '%: %.c\b' 找到它。

内置变量LINK.C 计算结果为:

LINK.c = $(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH)

看到您的最后一条评论,您所要做的就是调用 make 并覆盖正确的变量:

make price CC=clang CFLAGS="-fsanitize=signed-integer-overflow -fsanitize=undefined -ggdb3 -O0 -std=c11 -Wall -Werror -Wextra -Wno-sign-compare -Wno-unused-parameter -Wno-unused-variable -Wshadow" LDLIBS="-lcrypt -lcs50 -lm"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-12
    • 1970-01-01
    • 1970-01-01
    • 2010-11-13
    • 1970-01-01
    • 2016-04-05
    • 2017-03-31
    相关资源
    最近更新 更多