2014-03-04 69 views
0

我已經創建了一個使用visual studio 2010的程序,該程序沒有錯誤。但是,當我嘗試在Linux中運行它時,使用g ++編譯器,我遇到了一些有關未知函數的錯誤,這些錯誤應該是已知的。使用Linux編譯C++程序和其他庫g ++

我有以下文件:

main.cpp 
header.h 
header.cpp (all in the same folder) 

header2.h (which is in a different folder, /.../header2 

各種庫,存儲在另一個文件夾中,/.../libs

編譯我用g ++編譯器的代碼,寫在下面終端:

g++ main.cpp header.cpp -I/.../header2 -L/.../libs 

我讀過-I前綴指定包含頭文件的include目錄,而-L前綴指定庫目錄。

當我編譯程序它給我的錯誤,而不是從time.h中圖書館認識的功能。我檢查是否安裝了頭,用 查找/ usr/include目錄-name time.h中 並返回我time.h中報頭的位置。我也試着用-lrt編譯,但是它不起作用 g ++ main.cpp header.cpp -I /.../ header2 -L /.../ libs -lrt

I'對Linux非常新,所以任何幫助,將不勝感激。

謝謝。

編輯: 我得到實際的錯誤是:

ellipse_fit.cpp: In function ‘void Create_Permutation(int*, int, int)’: 
ellipse_fit.cpp:53:29: error: ‘rand’ was not declared in this scope 
    a[i] = (int)((double)rand()/RAND_MAX*(double)range); 

ellipse_fit.cpp:53:31: error: ‘RAND_MAX’ was not declared in this scope 
    a[i] = (int)((double)rand()/RAND_MAX*(double)range); 

的ellipse_fit.cpp將是我在我的例子中提到的header.cpp的equivelent。

+0

聽起來像是你實際上並沒有包括'time.h'任何地方 - 它往往是一些系統頭「在別人拖」,在一個系統,而不是當你在另一個環境編譯的情況。這將有助於你的很多人能夠用你的真實路徑和真正的頭文件產生你所看到的最小的例子。 –

+0

編輯我在原帖中得到的實際錯誤! –

+1

那麼,代碼看起來像重現這個?你是否包含'stdlib.h'或'cstdlib'? –

回答

1

這種事情發生在一個系統中的#include "something.h"包含您在代碼中依賴的頭文件,並且當您移動到另一個目標系統時,「something.h」不包含該特定頭文件(Windows源代碼也有一個非常惱人的習慣,包括「stdafx.h」,後者又包含了一些你沒有想到的頭文件)。

的解決方案是包含頭文件,爲您提供源文件中所需要的功能。假設頭文件正確地使用了include guard,那麼如果多加幾次包含相同的文件,就不會有什麼不好的事情發生。即使相當複雜的頭文件也幾乎沒有時間(我在這裏做了一個實驗,因爲這裏有一個問題,顯示當你「不必要地」在30個源文件中包含一個相當大的頭文件時,它會在幾秒鐘的編譯中增加毫秒 - 現代編譯器甚至會緩存頭文件,所以如果兩次包含同一個文件,它就知道它已經被看到,並知道它是否包含了包含守護進程,如果它需要再次進入,甚至沒有讀取文件)。