在VSCode中使用gcc编译C程序时出错

时间:2018-09-17 06:01:51

标签: c

我想在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

3 个答案:

答案 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正在启动其他程序(例如cc1asld)。如果您想了解哪个,请在上述命令的-v之后插入gcc

请务必阅读您正在使用的每个函数的documentation(因此至少请阅读printf(3)scanf(3)log(3)。 )以及您正在使用的每个程序(例如of gccof Visual studio code)。

一旦您要编写由几个翻译单元(例如foo.cbar.cgee.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",
    }

现在正在工作。