【问题标题】:Error while compiling C program with gcc in VSCode在 VSCode 中使用 gcc 编译 C 程序时出错
【发布时间】:2019-02-21 00:18:48
【问题描述】:

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

【问题讨论】:

  • 你为什么使用 GCC 作为编译器,却在标题中声称你正在使用 Visual Studio?
  • @JonathanLeffler "Visual Studio" 和 "VSCode" 是两个不同的东西。一是IDE(包括编译器等),二是可扩展的编辑器。
  • @Yunnosch:哦!这很混乱!这可能部分解释了为什么提到 Code Runner,等等。哦,好吧,我活着,偶尔我会学习(其余时间我的大脑被琐事堵塞,无法再学习了)。希望下次能记住。
  • 您确定要无限制地递归调用您的函数吗? return (func(n/2) + n*(log(n)));
  • 不应该是return (2*func(n/2) + n*(log(n)));吗?

标签: c


【解决方案1】:

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 要求提供额外警告。你会很高兴得到它们

  • -gDWARF 中请求调试信息。你真的希望能够use the gdb debugger,而gdb实际上需要调试信息。

  • q2.c是你唯一的translation unit的源文件

  • -lm 用于您的数学库。您正在使用 log(3) 并且它的文档提到了这一点。

  • -o q2 告诉gcc 将可执行文件放入q2(实际工作由gcc 调用的ld 链接器完成)

如何配置 Visual Studio 代码以使用该命令是您的事。否则,您可以在终端中键入上述命令。然后,您可以通过在终端中为您的shell 键入./q2 来运行您的q2 程序(您可以使用gdb on it)。

注意gcc 正在启动其他程序(如cc1asld)。如果您想了解哪些,请在上面的命令中的gcc 之后插入-v

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

一旦你将编写由几个翻译单元(例如foo.cbar.cgee.c)组成的更大的程序,你会想要使用一些build automation工具(因为编译每次都可以使用gcc -Wall -Wextra -g foo.c bar.c gee.c -lm -o qqq,但是不方便)。你可以学习使用GNU make(或ninja)。

阅读How to debug small programs。不要期望您的程序一开始就按您的意愿运行。

顺便说一句,研究一些现有 free software 程序的源代码(但从简单的项目开始,例如 github,少于十万行)。这可以教给你很多有用的东西。

【讨论】:

  • 您可以在终端中编译您的代码。你可以在终端(或在调试器下)运行它
【解决方案2】:

我不确定 VSCode 是如何编译程序的,但由于它使用 GCC,因此您可能需要在编译时通过向 GCC 提供参数 -lm 来链接数学库 libm

【讨论】:

    【解决方案3】:

    只需在 VS Code 的 file->preferences->settings 下调整代码运行器的 settings.json 即可:

    我已添加以下行

    "code-runner.executorMap": 
        {
            "c": "cd $dir && gcc -Wall -Wextra -g  $fileName -lm -o $fileNameWithoutExt && $dir$fileNameWithoutExt",
        }
    

    现在可以了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-05
      • 2011-03-11
      • 2021-11-06
      • 2022-01-04
      • 1970-01-01
      • 2021-10-16
      • 1970-01-01
      相关资源
      最近更新 更多