2015-10-18 111 views
-1

我正在使用带有编译器版本Apple LLVM版本7.0.0的MacBook Air(13英寸,2011年中)上的NetBeans IDE 8.0.2(Build 201411181905)(OSX 10.10.5) -700.0.72)/ Target:x86_64-apple-darwin14.5.0。无法编译C程序

我想要编译如下代码: 栈/主

#include "stack.h" 
#include <stdio.h> 
#include <stdlib.h> 
/* 
* 
    */ 
int main(int argc, char** argv) { 

push(1.2); 
(void)printf("On Stack"); 


//return (EXIT_SUCCESS); 
} 

栈/ src目录/ stack.c

#include <stdio.h> 
#include "stack.h" 

/* initialize stack for float values */ 
static float stack[STACK_LENGTH] = { 0.0 }; 

/* 
* increase stack and push new float into stack[0] 
* params: 
* float > new value to push to position 0 
* return: 
* void 
*/ 
void push(float new) { 
    /* to do */ 
    if(pos<STACK_LENGTH){ 
     stack[pos++]=new; 
    }else{ 
     (void)printf("Stack-Overflow\n"); 
    } 
} 

/* 
* pop float at position 0 and decrease stack 
* params: void 
* return: float > value at position 0 
*/ 
float pop(void) { 
    /* to do */ 
    if(pos>0){ 
     stack[pos--]; 
    } else{ 
     (void)printf("Stack-leak\n"); 
    } 
} 

/* 
* get stack at pos 
* params: int > stack position 
* return: float > value at position pos 
*/ 
float get(int pos) { 
    /* to do */ 
    float value; 
    return value = stack[pos]; 
} 

/* 
* set float value in stack at pos 
* params: 
* float > value to set at position pos 
* int > stack position 
* return: 
* void 
*/ 
void set(float value, int pos) { 
    /* to do */ 
    stack[pos] = value; 
} 

/* 
* list stack to console 
* params: 
* void 
* return: 
* int > number of characters printed 
*/ 
int list(void) { 
    /* to do */ 
    return 0; 
} 

/* 
* clear stack 
* params: void 
* return: void 
*/ 
void clear(void) { 
    /* to do */ 
    float stack[15]= {0.0}; 
} 

栈/ src目录/ stack.h

#ifndef STACK_H_ 
#define STACK_H_ 

/* Includes */ 
#include <stdio.h> 
#include <stdlib.h> 

/* stack size */ 
#define STACK_LENGTH 15 

/* global variables*/ 
static float stack[STACK_LENGTH]; 
static int pos = 0; 

/*function declaration*/ 
void push(float); 
float pop(); 
float get(int); 
void set(float, int); 
int list(); 
void clear(); 



#endif /* STACK_H_ */ 

当我运行这条语句时:

gcc -c demo_stack.c

我得到这个错误:

>fatal error: 'stack.h' file not found 
>#include "stack.h" 
>  ^
+1

编译器告诉你他没有足够的信息来查找文件'stack.h'。你必须添加一个包含你的编译器命令行的路径。对于gcc,这通常使用'-I directoryNameGoesHere'选项完成。 –

+0

你的意思是这样的:gcc -c -l stack/src/demo_stack.c – ishango

回答

1

正如你所看到的文件在不同的文件夹和一个编译器不能读你的心和你的意图:

stack/src/stack.c 
stack/src/stack.h 
stack/main/demo_stack.c? 

首先如果要将它们链接在一起并生成可执行文件,则需要编译这两个c文件,因为具有main()函数的文件引用功能push,该函数在stack.h中声明,但在stack.c中定义。然后你需要告诉你的编译器,编译你的主文件时应该考虑包含stack.h的路径。您的最终构建命令应该看起来像

clang -c -I../stack demo_stack.c ../stack/stack.c 
+0

我已经做了更改并创建了.o文件。现在我得到这样的:'主根$ GCC -c demo_stack.c 根$ gcc的-o stack.exe demo_stack.o用于建筑x86_64的 未定义的符号: “_push”,从引用:在demo_stack.o LD _main :找不到x86_64架构的符号 clang:错误:连接器命令失败,退出代码1(使用-v查看调用)' – ishango

+0

明白了! gcc stack.o demo_stack.o -o demo_stack – ishango