我按照操作系统:三个简单的部分一书,introduction chapter中的代码,
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <assert.h>
#include "common.h"
int
main(int argc, char *argv[])
{
if (argc != 2)
{
fprintf(stderr, "usage: cpu <string>\n");
exit(1);
}
char *str = argv[1];
while(1)
{
Spin(1);
printf("%s\n", str);
}
return 0;
}
当我尝试gcc -o cpu cpu.c -Wall
时,
出现错误:致命错误:'common.h'文件未找到,
我尝试从this link下载common.h,并将此文件放在cpu.c中,但它不起作用,错误消息:
cpu.c:8:1: error: conflicting types for 'main'
main(int argc, char *argv[])
^
./common.h:86:13: note: previous declaration is here
extern int main(int, char **, char **);
^
cpu.c:18:5: warning: implicit declaration of function 'Spin' is invalid in C99 [-Wimplicit-function-declaration]
Spin(1);
^
1 warning and 1 error generated.
如何修复错误?感谢。
答案 0 :(得分:2)
此问题的"common.h"
标题在第1章旁边的课程目录中链接为tgz包:http://pages.cs.wisc.edu/~remzi/OSTEP/
将其放在源文件旁边,然后再次尝试编译。
答案 1 :(得分:0)
您的主要功能声明应遵循i
:
common.h
并使用以下内容编译代码:
#include <stdio.h>
#include "common.h"
// not this:
//int main(int argc, char *argv[]) {
// but:
int main(int argc, char *argv[], char *argv2[]) {
return 0;
}
答案 2 :(得分:0)
这是您正在寻找的。所有其他答案都不明白您是在使用OS书籍。请参阅网站上提供的链接。
http://pages.cs.wisc.edu/~remzi/OSTEP/Code/code.intro.tgz
#ifndef __common_h__
#define __common_h__
#include <sys/time.h>
#include <assert.h>
#include <pthread.h>
double GetTime() {
struct timeval t;
int rc = gettimeofday(&t, NULL);
assert(rc == 0);
return (double)t.tv_sec + (double)t.tv_usec/1e6;
}
void Spin(int howlong) {
double t = GetTime();
while ((GetTime() - t) < (double)howlong)
; // do nothing in loop
}
void Pthread_create(pthread_t *t, const pthread_attr_t *attr,
void *(*start_routine)(void *), void *arg) {
int rc = pthread_create(t, attr, start_routine, arg);
assert(rc == 0);
}
void Pthread_join(pthread_t thread, void **value_ptr) {
int rc = pthread_join(thread, value_ptr);
assert(rc == 0);
}
void Pthread_mutex_lock(pthread_mutex_t *mutex) {
int rc = pthread_mutex_lock(mutex);
assert(rc == 0);
}
void Pthread_mutex_unlock(pthread_mutex_t *mutex) {
int rc = pthread_mutex_unlock(mutex);
assert(rc == 0);
}
void Pthread_mutex_init(pthread_mutex_t *mutex, pthread_mutexattr_t *attr) {
int rc = pthread_mutex_init(mutex, attr);
assert(rc == 0);
}
#endif // __common_h__
答案 3 :(得分:-1)
common.h不是要添加的标准头。如果你想编译并运行这段代码,是否找到包含Spin()的common.h或者编译并运行你的代码而不用Spin()和common。省略Spin()和common.h不会影响对书中提供的讨论的理解