Mac版VS Code出现未定义符号错误,求解决方案
在VS Code中编译C项目遇到未定义符号错误
我用VS Code开发C项目,程序在Xcode里能正常运行,但在VS Code里编译时出现未定义符号错误,我知道是没链接.c文件,但不知道具体怎么操作。
错误信息
ld: Undefined symbols: _StackDestroy, referenced from: _main in main-803f4a.o _StackInitDefault, referenced from: _main in main-803f4a.o _StackPush, referenced from: _main in main-803f4a.o _StackTop, referenced from: _main in main-803f4a.o clang: error: linker command failed with exit code 1 (use -v to see invocation)
项目代码文件
main.c
#include <stdio.h> #include <stdlib.h> #include "stack.h" int main(int argc, char* argv[]) { STACK hStack; char c; hStack = StackInitDefault(); if (hStack == NULL) { printf("Failed to allocate space for stack object.\n"); exit(1); } scanf("%c", &c); StackPush(hStack, c); printf("Top of stack is: %c\n", StackTop(hStack, NULL)); StackDestroy(&hStack); return 0; }
stack.h
#ifndef stack_h #define stack_h #include "status.h" typedef void* STACK; STACK StackInitDefault(void); Status StackPush(STACK hStack, char c); Status StackPop(STACK hStack); char StackTop(STACK hStack, Status* pStatus); void StackDestroy(STACK* phStack); Boolean StackIsEmpty(STACK hStack); #endif
stack.c
#include <stdio.h> #include <stdlib.h> #include "stack.h" struct node; typedef struct node Node; struct node { char value; Node* next; }; struct stack { Node* head; }; typedef struct stack Stack; STACK StackInitDefault(void) { Stack* pStack = (Stack*)malloc(sizeof(Stack)); if (pStack != NULL) { pStack->head = NULL; } return pStack; } Boolean StackIsEmpty(STACK hStack) { Stack* pStack = (Stack*)hStack; return (pStack->head == NULL)?TRUE:FALSE; } char StackTop(STACK hStack, Status* pStatus) { Stack* pStack = (Stack*)hStack; if (StackIsEmpty(hStack)) { if (pStatus != NULL) { return FAILURE; } return 'e'; } if (pStatus != NULL) { return SUCCESS; } return pStack->head->value; } Status StackPush(STACK hStack, char c) { Stack* pStack = (Stack*)hStack; Node* temp = (Node*)malloc(sizeof(Node)); if (temp == NULL) { return FAILURE; } temp->value = c; temp->next = pStack->head; pStack->head = temp; return SUCCESS; } Status StackPop(STACK hStack) { Stack* pStack = (Stack*)hStack; Node* temp; if (StackIsEmpty(hStack)) { return FAILURE; } temp = pStack->head; pStack->head = pStack->head->next; free(temp); return SUCCESS; } void StackDestroy(STACK* phStack) { Stack* pStack = (Stack*)*phStack; Node* temp = pStack->head; while (pStack->head != NULL) { temp = pStack->head; pStack->head = pStack->head->next; free(temp); } free(pStack); *phStack = NULL; }
status.h
#ifndef status_h #define status_h enum status { FAILURE, SUCCESS }; typedef enum status Status; enum boolean { FALSE, TRUE }; typedef enum boolean Boolean; #endif
解决方法
方法1:终端手动编译链接
在项目目录打开终端,执行命令将所有.c文件一起编译链接:
clang main.c stack.c -o stack_program
运行生成的程序:
./stack_program
方法2:配置VS Code的tasks.json自动编译
- 按
Ctrl+Shift+B(Windows/Linux)或Cmd+Shift+B(Mac),选择"创建tasks.json文件",选"others"模板。 - 将tasks.json内容替换为:
{ "version": "2.0.0", "tasks": [ { "label": "Compile & Link", "type": "shell", "command": "clang main.c stack.c -o stack_program", "group": { "kind": "build", "isDefault": true }, "problemMatcher": { "owner": "c", "fileLocation": "absolute", "pattern": { "regexp": "^(.*?)(\\((\\d+),(\\d+)\\))?:\\s+(error|warning):\\s+(.*)$", "file": 1, "line": 3, "column": 4, "severity": 5, "message": 6 } } } ] }
- 保存后,再次按
Ctrl+Shift+B即可自动完成编译链接。
方法3:使用Makefile管理编译(适合多文件项目)
在项目根目录创建Makefile文件,内容如下:
CC = clang CFLAGS = -Wall -Wextra TARGET = stack_program SRCS = main.c stack.c all: $(TARGET) $(TARGET): $(SRCS) $(CC) $(CFLAGS) -o $@ $^ clean: rm -f $(TARGET)
终端执行make命令编译,make clean清理生成的可执行文件。
内容的提问来源于stack exchange,提问作者bluediager
相关产品推荐
相关产品推荐

