我目前正在从事一个 C 编程项目,遇到了一个我正在努力解决的问题。
问题:
我使用 Visual Studio Code (VS Code) 作为我的代码编辑器。该项目由以下文件组成:
main.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;
}
}
列表.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
我已将“list.h”包含在“main.c”中以使用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 中测试了代码,但遇到了相同的“未定义引用”错误。我通过参考 YouTube 教学视频验证了我的代码,并将其与示例代码交叉引用。尽管我尽了最大努力,但仍无法解决这个问题。我什至咨询了我的编程教授,他无法找出问题所在。
因此,使用编译语言时主要有两类错误。
当特定文件中存在无效语法时,会发现源错误。
当特定文件中存在无效链接时,会发现链接器错误。
这里的Linker报告找不到具体的函数。这是因为您没有向编译器提供信息,而编译器又没有向链接器提供该信息。
根据您的特定编译器,您会发现一些标志,允许您指定要在程序中包含哪些源文件(.c / .cpp)。通常还有通配符说明符 (*),它允许您包含给定文件夹中的所有源。