2011-04-13 162 views
4

我遇到了我的Makefile問題。在crt1.o函數中未定義對「main」錯誤的引用_start

我試圖從2個文件中創建一個程序 - main.cpp包含main函數,modules.c包含main()中調用的函數的定義。 modules.c只包含函數定義,不包含主函數。

我的Makefile文件如下:

CC := gcc 
CXX := g++ 
LINK := g++ -Wall 
CFLAGS := -g 
CXXFLAGS := -g 

TARGET = program 

$(TARGET): modules.o main.o 
    $(LINK) -o [email protected] $< -lpcap 

clean: 
    rm *.o $(TARGET) 

modules.o: 
    $(CC) $(CFLAGS) -c modules.c -o [email protected] $< 

main.o: 
    $(CXX) $(CXXFLAGS) -c main.cpp -o [email protected] $< 

我已經包含了 「modules.h」,它包含了所有的函數聲明,在我的main.cpp。 CFLAGS和CXXFLAGS變量指向包含

正確的路徑當我嘗試使用這個Makefile做,我得到的錯誤

/usr/lib/gcc/x86_64-redhat-linux/4.4.4 /../../../../lib64/crt1.o:在函數 '_start':
(的.text + 0×20):未定義參照 '主'

如果我切換我的$(TARGET)行中的modules.o和main.o的順序,然後我得到錯誤,說「未定義的引用」,我已經在main.cpp modules.c中定義的函數。

我不知道什麼是錯的。

謝謝。

問候, 雷恩

+1

發表代碼... – Nawaz 2011-04-13 08:36:19

+0

我有一個類似的問題,當我拼寫'gcc -pipe'爲'gcc -pie' ... – gregn3 2015-02-13 12:25:44

回答

1

這裏有一對夫婦的提示:不需要.o文件

  1. -o [email protected] $<,所以從這些目標刪除。
  2. -Wall在編譯不鏈接時使用更有意義。所以我會將它添加到CCCXX行代替(或更好,到CFLAGSCXXFLAGS)。
  3. 乾淨的目標應該是.PHONY目標的依賴項,以便您可以始終執行它(無需事先檢查更改的依賴項)。

如果您仍然收到關於從modules.c中缺少對函數的引用的錯誤,那麼您可能會在main.cpp中缺少一些extern "C" ...語句。這是因爲C++函數的內部名稱的計算方式與C函數的內部名稱不同(我認爲C++在名稱空間,類名稱等前加上所有名稱)。要告訴C++可以使用舊的內部名稱進行鏈接來找到特定的函數,請使用extern「C」語句。

+0

謝謝extern「C」做的竅門! – Rayne 2011-04-13 08:55:14

8

使用$ ^而不是$ <。後者只包含第一個依賴項(modules.o),所以main.o沒有鏈接到可執行文件中。

+0

這解決了「未定義的主要參考」問題。但是現在我得到了「未定義的引用」,這是我在modules.c中定義的函數,在main.cpp錯誤中。在我的main.cpp中,我包含了modules.h,並在modules.c中聲明瞭函數作爲extern函數。 – Rayne 2011-04-13 08:43:19

+3

嘗試使用g ++編譯C代碼(如果僅用於測試)。C++有一些有趣的名字可能會在這裏碰撞。如果修復它,看看'extern「C」' – 2011-04-13 08:45:25

+0

謝謝,extern「C」做了詭計! – Rayne 2011-04-13 08:58:24

相關問題