我目前正在做一个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教学视频并与示例代码交叉引用来验证我的代码。尽管我尽了最大的努力,我还是无法解决这个问题。我甚至咨询了我的编程教授,他无法找出问题所在。
2条答案
按热度按时间taor4pac1#
因此,在使用编译语言时有两种主要的错误。
当特定文件中存在无效语法时,会发现源错误。
当特定文件中存在无效链接时,会发现链接器错误。
这里的链接器报告说它找不到特定的函数。这是因为您没有向编译器提供信息,而编译器又没有向链接器提供该信息。
根据您的特定编译器,您会发现一些标志,允许您指定在程序中包含哪些源文件(.c / .cpp)。通常也有一些指定符(*),允许你在一个给定的文件夹中包含所有的源代码。
在开发编译软件时,还有另一种工具会增加更多的混乱。IDE。IDE只是一个用来编写代码的工具,它使用各种技巧使编写代码变得更容易。IDE既不是编译器也不是链接器。它只知道在不同的情况下在哪里找到它们。VSCode很擅长找到你的编译器。
pbwdgjma2#
花了整个下午思考这个问题后,我决定从头开始。我选择了一个我以前测试过的IDE,创建了一个简单的测试程序,令我惊讶的是,它工作得很好。我开始一行一行地复制代码,沿着测试函数,一切都很顺利。
我得出的结论是,问题出在vscode上。
奇怪的是,以前,我曾尝试使用Ctrl+C和Ctrl+V复制和粘贴代码,但它没有工作。即使我再次尝试复制和粘贴,它也失败了。出于我无法理解的原因,复制粘贴操作似乎是问题所在。尽管如此,代码现在工作得很好。
我想对所有回应并试图帮助解决这个问题的人表示感谢。
现在我的计划是找到一种方法让VS Code无缝地将所有文件编译在一起。使用
gcc -o program *.c
通过终端进行编译似乎是一种可行的方法,因此我打算探索创建tasks.json文件或修改C/C++ Compile Run扩展的设置的可能性,我一直在使用该扩展来简化该过程。编辑:我喜欢和讨厌事情是如何决定的。现在vs code决定它将正确编译。我没有改变任何东西,我没有更新任何东西,我没有停止使用我正在使用的扩展,它只是工作