【发布时间】: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);
}
我已经在我的系统上手动安装了 libcs50:
# 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参数。
谢谢!
解决方案
根据以下说明设置CC、CFLAGS 和LDLIBS:https://cs50.readthedocs.io/libraries/cs50/c/。
由于这些环境变量,讲座视频中的所有“自动”内容都是可能的。
【问题讨论】:
-
它怎么知道如何“神奇地”添加一些随机库? (即,不,它不会那样做)。
-
我以为它会添加它。因为我已经在我的系统中安装了这个库,并且我用
#include <cs50.h>调用了它。在这一点上,我认为讲师必须在他的沙箱中配置了一些额外的东西,因为他在没有 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