2017-09-25 82 views
0

我很确定这是一个简单的问题,但我在网上搜索了大约半个小时。编译ubuntu中的头文件。我在终端输入什么?

我有3个文件:

02_01.c

#include <stdio.h>   // Notice the library included in the header of this file 
#include <stdlib.h> 

#include "myLibrary.h"  // Notice that myLibrary.h uses different include syntax 

#define MAX_LENGTH 21.8 
#define WORK_WEEK 5 

int main(void) { 
    function1(); 
    return EXIT_SUCCESS; 
} 

myLibrary.c

void function1(void){ 
    puts("It works :)"); 
} 

void function2(void){ 
    //This function does nothing as well 
} 

myLibrary.h

#ifndef MYLIBRARY_H_ 
#define MYLIBRARY_H_ 

void function1(void); 
void function2(void); 

#endif /* MYLIBRARY_H_ */ 

首先,我浏览到我的工作目录。 通常在没有本地头文件我会键入:

gcc -o 02_01 02_01.c 
./02_01 

,它会工作。

我已经尝试了各种东西,如:

的gcc -o 02_01 02_01.c myLibrary.c

这给了我函数 '使'

GCC的错误“隐式声明-o在MyLibrary myLibrary.c这也给了同样的错误。

什么我应该在终端在Ubuntu打字?

所以我假设在myLibrary.c中的puts()函数没有连接到02_01.c,这是我包含stdio.h的地方。

+1

您必须在其中使用该函数的标头,而不是在另一个.c文件中。 gcc无法建立两个文件之间的链接。你的问题是什么?你不想改变文件的内容? –

+5

'myLibrary.c'中的代码使用标准的I/O函数,这些函数在''中声明。所以也许你应该把这个头文件包含在'myLibrary.c'中?头文件只是当前[*翻译单元*](https://en.wikipedia.org/wiki/Translation_unit_(编程))的一部分,它们不会泄漏到其他独立翻译单元。(一个翻译单元基本上是一个单独的源文件及其包含的所有头文件,因此是独立单元。) –

+0

@ Jean-FrançoisFabre谢谢。这就是我在C++中所做的。我实际上是从Lynda接下来的一段视频课,这些都是作为例子提供的文件。他们在Windows中使用Eclipse,所以也许这就是为什么它为他们工作,而不是在Ubuntu上为我工作。 – t3hdaniel

回答

1

您必须在每个文件中包含所需的标题,您需要在其中使用包含的功能。对于您的情况,您必须在myLibrary.c文件的开头包含#include <stdio.h>

此外,您可能想要构建.a库并稍后与它链接。

所以,最后:

  1. 编译的lib:

     gcc -c -o mylib myLibrary.c 
    
  2. 让静态库:

     ar rcs libMyLib.a mylib 
    
  3. 编译程序和链接在一起:

     gcc -o 02_01 02_01.c -L. -lMyLib