2012-01-04 33 views
4

我想使用arm-linux-gcc編譯器套件[arm-linux-gcc(Buildroot 2011.08))爲ARM體系結構交叉編譯一個簡單的程序。 4.3.6。我試圖用一個簡單的makefile來編譯C代碼,另一個簡單的makefile來編譯C++代碼。例如,我的C代碼生成文件在下面被重現,但它不會創建一個ELF二進制文件在我的嵌入式系統上運行。主機系統是x64 GNU Linux。使用arm-linux-gcc的C/C++目標的簡單makefile

這是我很簡單的makefile的一個C程序列表:

CC=arm-linux-gcc 
CFLAGS=-Wall 
main: test.o 

clean: 
    rm -f test test.o 

轉載上述內容生成文件只創建與擴展的.o目標文件,並不會創建一個ELF二進制文件。

我已經谷歌搜索一個很好的解決方案,但我似乎無法找到一個網頁顯示示例爲C和C++程序交叉編譯ARM makefiles。也許這篇文章的答案可能會顯示這樣的例子。

回答

3

我想你Makefile,改變了以下內容:

test: test.o 

它的工作後,這個改變並創建了一個名爲test二進制文件。似乎有一些隱含的規則知道如果鏈接whatever,如果它的一個依賴關係是whatever.o

另一種方式是列出明確的規則:

main: test.o 
     $(CC) -o [email protected] $$ 

它使用專用宏[email protected](這意味着目標)和$$(這意味着依賴)。

+0

謝謝,Greg;這很好。 – 2012-01-04 18:49:02

5

看看GNU make手冊(info make),Section 10.2。它有一個隱式規則的目錄,即你不需要明確聲明命令的規則。就像@GregHewgill所認爲的,「鏈接單個目標文件」隱式規則從N.o開始建立N,但名稱必須匹配。因此,您可以命名您的可執行喜歡你的目標文件,在這種情況下

test: 

或(更標準,因爲它定義了all目標)

all : test 

完全足夠了。您也可以明確地寫出規則,如Greg Hewgill所述。在這種情況下,標準的規則是:

$(CC) $(LDFLAGS) N.o $(LOADLIBES) $(LDLIBS) 

包含的LDFLAGS,並在你的Makefile LDLIBS,它使生活更方便用戶使用。

(原文如此:我認爲LOADLIBES真的是LOADLIBS,而作者錯過了-o)。總體而言,我建議使用autoconfautomake而不是手動滾動makefiles。爲您提供一大堆Makefile功能,只需很少的工作。

+0

謝謝你的好評,thiton;這非常感謝。 – 2012-01-04 20:08:55