当我使用Xcode for C ++编辑模拟过程的简单演示时,会出现错误:
Undefined symbols for architecture x86_64:
"exit()", referenced from:
menu() in main.o
"kill()", referenced from:
menu() in main.o
ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation)
以我有限的C ++经验,我从来没有遇到过这个问题,我在网上搜索了很长时间,但是没有用。请帮助或尝试给我一些实现该想法的想法。预先感谢。
我的Xcode版本是10.1。
<!-- language: C++ -->
#include<iostream>
#include<string.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -2
void create();
void kill();
void display();
void exit();
struct PCB
{
char NAME[10];
long ID;
float TIME;
int PRIORITY;
};PCB pcb[100];
typedef struct QNode
{
int data;
struct QNode*next;
}QNode,*QueuePtr;
typedef struct
{
QueuePtr front;
QueuePtr rear;
}LinkQueue;LinkQueue Ready,Empty;
int InitQueue()
{
Ready.front=Ready.rear=new QNode;
Empty.front=Empty.rear=new QNode;
Ready.front->next=NULL;
Empty.front->next=NULL;
return OK;
}
void menu()
{
std::cout<<"****=========="<<"1. 进程创建 \n";
std::cout<<"****=========="<<"2. 进程撤销 \n";
std::cout<<"****=========="<<"3. 就绪队列显示 \n";
std::cout<<"****=========="<<"4. 退出 \n";
int choice;
std::cout<<" 请选择: ";
std::cin>>choice;
switch(choice)
{
case 1:create();break;
case 2:kill();break;
case 3:display();break;
case 4:exit();
}
}
void create()
{
char name[10];
long id;
float time;
int priority;
int n;
QNode *p;
std::cout<<" 请输入要创建进程的数目: ";
std::cin>>n;
for(int i=1;i<=n;i++)
{
std::cout<<" 进程 ID :"; std::cin>>id;
for(int j=i-1;j<=n;j++)
{
while(id==pcb[j].ID)
{
std::cout<<" 进程 ID 已存在 "<<std::endl;
std::cout<<" 进程 ID :"; std::cin>>id;
}
}
std::cout<<" 进程名: ";
std::cin>>name;
std::cout<<" 运行时间: ";
std::cin>>time;
std::cout<<" 优先级: ";
std::cin>>priority;
n++;// 保存当前就绪进程数
strcpy(pcb[n].NAME,name);
pcb[n].ID =id;
pcb[n].TIME =time;
pcb[n].PRIORITY =priority;
p=new QNode;// 插入就绪队列
p->data=n;
p->next=NULL;
Ready.rear->next=p;
Ready.rear=p;
}
for(int i=1;i<=n;i++)// 按优先级排队
{
for(int j=i+1;j<=n;j++)
if(pcb[i].PRIORITY<pcb[j].PRIORITY)
{
pcb[0]=pcb[i];
pcb[i]=pcb[j];
pcb[j]=pcb[0];
}
}
menu();
}
void kill(int n)// 进程终止
{
long id;
QNode *p,*q;
std::cout<<" 请输入要终止的进程 ID:";
std::cin>>id;
p=Ready.front->next;
if(p==NULL)
std::cout<<" 就绪进程为空! ";
while(p!=NULL)
{
if(id==pcb[n].ID)// 终止进程是队列最后一个
{
if(n==1) // 队列中只有一个进程,且是终止进程
{
q=new QNode;
q->data=Ready.rear->data;
Empty.rear->next=p;
Empty.rear=p;
Ready.front =Ready.rear;
Ready.front ->next =NULL;
n--;
std::cout<<" 进程已终止! ";
break;
}
else //队列中进程多个
{
while(p!=NULL)
{
if(p->next->next ==NULL)
{
q=new QNode;
q->data=Ready.rear->data;
Empty.rear->next=p;
Empty.rear=p;
p->next =NULL;
Ready.rear =p;
n--;
std::cout<<" 进程已终止! ";
break;
}
p=p->next ;
}}}
if(id==pcb[p->data].ID)
{
if(Ready.front==Ready.rear)
std::cout<<" 队列为空 !"<< std::endl;
while(p!=NULL)
{
pcb[p->data]=pcb[p->data+1];// 修改 PCB 数组里的值
if(p->next ->next ==NULL)
{
q=new QNode;
q->data=Ready.rear->data;
Empty.rear->next=p;
Empty.rear=p;
p->next =NULL;
Ready.rear =p;
std::cout<<" 进程已终止! ";
break;
}
p=p->next;
}
n--;
break;
}
p=p->next ;
}
menu();
}
void display()
{
QNode *p;
p=Ready.front->next;
std::cout<<"ID"<<" "<<" 名字 "<<" "<<" 运行时间 "<<" "<<" 优先级"<<std::endl;
while(p!=NULL)
{
std::cout<<pcb[p->data].ID<<""<<pcb[p->data].NAME<<""<<pcb[p->data].TIME <<""<<pcb[p->data].PRIORITY<<std::endl;
p=p->next ; }
menu(); }
int main()
{
InitQueue();
pcb[0].ID =0;
menu();
}
答案 0 :(得分:0)
我知道:
void kill();
void exit();
当您实际将代码定义为时,在C ++文件的顶部声明:
void kill(int n)// 进程终止
{
...
...
更改C ++文件顶部的声明以匹配代码。并且每当您在代码中调用kill
时,都传递1
或任何您想要的n
(例如kill(1)
)。
另外,unlike kill
,exit()
already exists in C++,您应该从代码顶部删除该声明,并且每当调用它时,都应使用exit(0)
之类的东西。