我想在VS Code中编译以下代码,但是我正在使用“代码运行器”来获取此错误。我到处都在抬头,但这并不能解决我的问题。
我要实现此T(n) = 2T(n/2) + nlog(n)
q2.c
// b. T(n) = 2T(n/2) + nlog(n)
#include <stdio.h>
#include <math.h>
int func(double n)
{
return (2*func(n/2) + n*(log(n)));
}
int main()
{
double n, result;
printf("Enter the value of 'n' \n");
scanf("%lf",&n);
printf("Hey");
result = func(n);
printf("%lf \n",result);
printf("Hey");
return 0;
}
控制台:
user@user-H310M-DS2:~/Desktop/C programming/Assignments$ cd "/home/user/Desktop/C programming/Assignments/" && gcc q2.c -o q2 && "/home/user/Desktop/C programming/Assignments/"q2
/tmp/ccnNXN3L.o: In function `func':
q2.c:(.text+0x3a): undefined reference to `log'
collect2: error: ld returned 1 exit status
答案 0 :(得分:3)
Visual studio code与您的问题无关,您不对其进行编译。因为它是IDE(或源代码编辑器),而不是编译器。我猜您在某些Linux或POSIX系统上使用它。顺便说一句,我首选的source code editor是GNU emacs。因此,您的IDE正在运行一些编译命令(您需要 了解哪些命令以及这些命令在做什么)。您可以在终端中运行这些命令(实际上可能更简单)。
如控制台日志所示,您正在使用GCC进行编译。一些gcc
命令已经启动(可能是Visual Studio代码启动的。)
仔细阅读有关Invoking GCC的信息。争论的顺序很重要!
您应该使用
编译代码gcc -Wall -Wextra -g q2.c -lm -o q2
让我解释一下:
gcc
是您的编译器前端(实际的编译器is cc1
,但您从未直接使用它;您要求gcc
运行它)
-Wall
询问几乎所有警告
-Wextra
要求其他警告。您会很高兴得到他们
-g
询问DWARF中的调试信息。您确实希望能够use the gdb
debugger,并且gdb
实际上需要调试信息。
q2.c
是您唯一的translation unit
-lm
用于您的数学库。您正在使用log(3),它的文档中提到了这一点。
-o q2
告诉gcc
将可执行文件放入q2
(实际工作由ld
调用的gcc
链接程序完成) / p>
如何配置Visual Studio代码以使用该命令是您的事。您也可以在终端中键入以上命令。然后,您可以在终端中为shell输入q2
来运行./q2
程序(并且可以使用gdb
on it)。
请注意,gcc
正在启动其他程序(例如cc1
,as
,ld
)。如果您想了解哪个,请在上述命令的-v
之后插入gcc
。
请务必阅读您正在使用的每个函数的documentation(因此至少请阅读printf(3),scanf(3),log(3)。 )以及您正在使用的每个程序(例如of gcc
和of Visual studio code)。
一旦您要编写由几个翻译单元(例如foo.c
,bar.c
,gee.c
)组成的更大的程序,您就想使用一些{ {3}}工具(因为每次都可以使用gcc -Wall -Wextra -g foo.c bar.c gee.c -lm -o qqq
进行编译,但不方便)。您可以学习使用build automation(或GNU make)。
阅读ninja。首先不要期望您的程序能够正常工作。
顺便说一句,研究一些现有的 How to debug small programs程序的源代码(但要从少于十万行的简单项目开始,例如在free software上)。这可以教你很多有用的东西。
答案 1 :(得分:2)
我不确定VSCode如何编译程序,但是由于它使用GCC,因此可能需要在编译时通过向GCC提供参数libm
来链接数学库-lm
。 / p>
答案 2 :(得分:0)
只是对VS Code的settings.json
-> file
-> preferences
下的跑步者settings
进行了调整:
我添加了以下行
"code-runner.executorMap":
{
"c": "cd $dir && gcc -Wall -Wextra -g $fileName -lm -o $fileNameWithoutExt && $dir$fileNameWithoutExt",
}
现在正在工作。