2012-05-06 74 views
0

我已經使用XCode編寫了我的程序。它在Mac上沒有任何問題。我被告知我們的項目將在Linux機器上編譯,所以我想在提交之前確保它在Linux上正常工作。當我試圖編譯在Linux上,這給了我一些參考錯誤:從OS X移動到Linux時出錯Red-Hat

/tmp/cckwoehj.o: In function `main': 
main.cpp:(.text+0x9): undefined reference to `ReadFile()' 
/tmp/cckwoehj.o: In function `leftSearch(NODE*, int)': 
main.cpp:(.text+0x38b): undefined reference to `conflict(int**)' 
main.cpp:(.text+0x3ca): undefined reference to `removeAllRowsWithLiteral(int**, int)' 
main.cpp:(.text+0x3ec): undefined reference to `removeAllSpecifiedLiteral(int**, int)' 
main.cpp:(.text+0x4ec): undefined reference to `conflict(int**)' 
main.cpp:(.text+0x522): undefined reference to `unitPropagation(int**)' 
main.cpp:(.text+0x538): undefined reference to `conflict(int**)' 
/tmp/cckwoehj.o: In function `rightSearch(NODE*, int)': 
main.cpp:(.text+0x992): undefined reference to `conflict(int**)' 
main.cpp:(.text+0x9d4): undefined reference to `removeAllRowsWithLiteral(int**, int)' 
main.cpp:(.text+0x9f3): undefined reference to `removeAllSpecifiedLiteral(int**, int)' 
main.cpp:(.text+0xaf3): undefined reference to `conflict(int**)' 
main.cpp:(.text+0xb29): undefined reference to `unitPropagation(int**)' 
main.cpp:(.text+0xb3f): undefined reference to `conflict(int**)' 
collect2: ld returned 1 exit status 

我在網上找到有關模板的所有談判的東西。我不使用模板。我還發現一個關於我沒有的32位和64位操作系統問題。

我有一個叫ReadFile函數是在頭部聲明。我從main調用它並在main中包含該頭文件。我不確定問題是什麼。如果OS X編譯並運行,而Linux不支持,我假設OS X內部有一些它認爲很明顯的東西,但Linux不是這樣寫的。這是一個鏈接器錯誤?我認爲OS X將被編程爲在內部執行此操作。

+2

你是如何構建Linux的代碼的? – juanchopanza

+0

發佈你的Makefile –

回答

1

你在聲明一個頭的功能,但沒有定義,導致未定義的引用,當您嘗試打開的main.cpp到可執行文件。

您需要編譯所有的源文件,並將它們連接在一起(以正確的順序)。

g++ -c ReadFile.cpp 
#... 
g++ -c main.cpp 
g++ main.o ... ReadFile.o -o my_executable 

凡客體文件到正確的依靠對象文件傳輸到其留在命令行定義的未解決的符號。

+0

是的工作。那麼對於ReadFile函數。我會爲其他人做同樣的事情。非常感謝。 我有幾個問題 - 因此,沒有OS X做到這一點給我嗎? Linux有沒有原因? 有什麼我可以做的修改我的代碼,以便我不必這樣做?我希望能夠通過簡單地說,運行它 - G ++ main.cpp中 另外,你是什麼意思,我宣佈我的功能,但沒有定義?我以爲xyz.h有聲明和xyz.cpp有定義?這不夠好嗎? – maverick1989

0

XCode是一個IDE,所以我想它會爲您處理鏈接順序。

爲了處理這一切的東西自動,你必須也使用IDE和/或寫一個Makefile文件。 如果您堅持使用單一命令,那麼只要您將所有源文件包含在該行中(例如g ++ * .cpp),就可以對每一次更改進行全面重新編譯。