C头文件的问题:未定义的引用错误

jk9hmnmh  于 2023-10-16  发布在  其他
关注(0)|答案(2)|浏览(146)

我目前正在做一个C编程项目,遇到了一个我正在努力解决的问题。
问题是:
我使用Visual Studio Code(VS Code)作为我的代码编辑器。该项目由以下文件组成:
主.c:

#include "list.h"
#include <stdio.h>

int main()
{
    List* l = lst_create();
    l = lst_inset(l,10);
    l = lst_inset(l,20);
    l = lst_inset(l,25);
    l = lst_inset(l,30);
    //l = lst_rem(l,10); 
    lst_print(l);

    return 0;
}

列表c:

#include <stdio.h>
#include <stdlib.h>
#include "list.h"

struct list
{
    int info;
    List *next;
};

List* lst_create()
{
    return NULL;
}

int lst_empty(List *l)
{
    return (l == NULL);
}

List* lst_inset(List *l, int info)
{
    List* lAux = (List*) malloc(sizeof(List));

    lAux -> info = info;
    lAux -> next = l;

    return lAux;
}

List* lst_search(List *l, int info)
{
    List* lAux = l;

    while (lAux != NULL)
    {
        if (lAux -> info == info)
        {
            return lAux;
        }

        lAux = lAux -> next;
    }

    return NULL;
}

void lst_print(List *l)
{
    List* lAux = l;

    while (lAux != NULL)
    {
        printf("Info = %d\n", lAux -> info);
        lAux = lAux -> next;
    }
}

list.h:

#ifndef LIST_H
#define LIST_H

typedef struct list List;

List* lst_create();

int lst_empty(List *l);

List* lst_inset(List *l, int info);

//List* lst_remove(List *l, int info);

//void lst_free(List *l);

void lst_print(List *l);

List* lst_search(List *l, int info);

#endif

我在“main.c”中包含了“list.h”,以使用list. c中定义的函数。然而,当我试图编译项目时,我遇到了以下链接器错误:

/usr/bin/ld: /tmp/ccCzNKTb.o: in function 'main':
/home/user/Codes/C/TestProject/src/main.c:7: undefined reference to 'lst_create'
/home/user/Codes/C/TestProject/src/main.c:8: undefined reference to 'lst_insert'
/home/user/Codes/C/TestProject/src/main.c:9: undefined reference to 'lst_insert'
/home/user/Codes/C/TestProject/src/main.c:10: undefined reference to 'lst_insert'
/home/user/Codes/C/TestProject/src/main.c:11: undefined reference to 'lst_insert'
/home/user/Codes/C/TestProject/src/main.c:13: undefined reference to 'lst_print'
collect2: error: ld returned 1 exit status

我已经确保main.c和list.c都存在于指定的目录中。函数lst_create、lst_insert和lst_print在list. h中声明,在list. c中定义。我还在两个不同的C IDE中测试了代码,但遇到了相同的“undefined reference”错误。我通过参考YouTube教学视频并与示例代码交叉引用来验证我的代码。尽管我尽了最大的努力,我还是无法解决这个问题。我甚至咨询了我的编程教授,他无法找出问题所在。

taor4pac

taor4pac1#

因此,在使用编译语言时有两种主要的错误。

  • 链接器错误
  • 来源错误

当特定文件中存在无效语法时,会发现源错误。
当特定文件中存在无效链接时,会发现链接器错误。
这里的链接器报告说它找不到特定的函数。这是因为您没有向编译器提供信息,而编译器又没有向链接器提供该信息。
根据您的特定编译器,您会发现一些标志,允许您指定在程序中包含哪些源文件(.c / .cpp)。通常也有一些指定符(*),允许你在一个给定的文件夹中包含所有的源代码。
在开发编译软件时,还有另一种工具会增加更多的混乱。IDE。IDE只是一个用来编写代码的工具,它使用各种技巧使编写代码变得更容易。IDE既不是编译器也不是链接器。它只知道在不同的情况下在哪里找到它们。VSCode很擅长找到你的编译器。

pbwdgjma

pbwdgjma2#

花了整个下午思考这个问题后,我决定从头开始。我选择了一个我以前测试过的IDE,创建了一个简单的测试程序,令我惊讶的是,它工作得很好。我开始一行一行地复制代码,沿着测试函数,一切都很顺利。
我得出的结论是,问题出在vscode上。
奇怪的是,以前,我曾尝试使用Ctrl+C和Ctrl+V复制和粘贴代码,但它没有工作。即使我再次尝试复制和粘贴,它也失败了。出于我无法理解的原因,复制粘贴操作似乎是问题所在。尽管如此,代码现在工作得很好。
我想对所有回应并试图帮助解决这个问题的人表示感谢。
现在我的计划是找到一种方法让VS Code无缝地将所有文件编译在一起。使用gcc -o program *.c通过终端进行编译似乎是一种可行的方法,因此我打算探索创建tasks.json文件或修改C/C++ Compile Run扩展的设置的可能性,我一直在使用该扩展来简化该过程。
编辑:我喜欢和讨厌事情是如何决定的。现在vs code决定它将正确编译。我没有改变任何东西,我没有更新任何东西,我没有停止使用我正在使用的扩展,它只是工作

相关问题