2017-09-25 85 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