2016-09-28 105 views
1

C++新手我的命令是g++ main.cpp -o main給我鏈接像下面多重連接C++文件在這裏

ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation)

錯誤,如果我通過C++文件g++ main.cpp myfile.cpp -o main一切是正確的

任何想法如何編譯多個C++文件不通過命令行傳遞所有內容。

感謝

+0

是否G ++調用鐺鏈接? –

+0

是的上述工作,但我認爲最好的辦法是創建make文件 – sger

+0

既然你已經知道,一個Makefile是要走的路,你有什麼問題? –

回答

1

任何想法如何編譯多個C++文件,而在命令行中傳遞的一切。

要構建應用程序,您需要所有的目標文件,因此您必須將所有cpp文件傳遞給編譯器。

但是當所有的CPP-文件留在一個文件夾中簡單的情況下,你可以 使用命令(簡單,但速度慢的方法):

g++ *.cpp -o main 
1

任何想法如何編譯沒有通過多個C++文件一切都在命令行中。

首先創建目標文件:

g++ -c main.cpp -o main.o 
g++ -c myfile.cpp -o myfile.o 

然後將它們傳遞給連接器:

g++ main.o myfile.o -o main 
+0

有時候庫中鏈接器命令列出的順序。你也可以閱讀這篇文章:[https://stackoverflow.com/questions/45135/...](https://stackoverflow.com/questions/45135/why-does-the-order-in-which -libraries-的連接 - 有時因 - 錯誤 - 在-GCC) – hoelzlw

1

雖然有是做一個相當大的學習曲線,生成文件是首選的解決方案。在SO上,我也注意到了CMake的大量使用。


爲你的Makefile更多的想法:

以下兩條規則處理90%我簡單的單元測試的可執行文件:

  • R01處理既.cc的文件和.hh

  • R02處理文件只有.cc


# pattern rule R01 
# when any ARCHIVE changes, trigger a rebuild 
% : %.cc %.hh $(LIB_ARCHIVEs) 
    @echo 
    @echo R01: $< 
    rm -f [email protected] 
    $(CC) $(CC_FLAGS) $< -o [email protected] $(LIB_DIRs) $(LIB_NMs) 

# pattern rule R02 
# when any ARCHIVE changes, trigger a rebuild 
% : %.cc $(LIB_ARCHIVEs) 
    @echo 
    @echo R02: $< 
    rm -f [email protected] 
    $(CC) $(CC_FLAGS) $< -o [email protected] $(LIB_DIRs) $(LIB_NMs) 

偶爾,我會添加特定的LIB名和目錄...直接向LIB_DIRs和LIB_NMs定義在Makefile中。例如,在這裏我添加-lrt和-pthread:

LIB_NMs += -lbag_i686 -lposix_i686 -lrt -pthread 

bag_i686和posix_i686是圖書館我建...簡單的C++類包裝圍繞Linux和POSIX功能。我的大部分單元測試都不會使用很多posix的東西,但是我不會感到悲傷。

使用C++ std :: thread,我很少使用-pthread。但是,我偶爾會使用posix信號量。


我的編譯的命令行訪問(在Ubuntu上的Emacs)提供了一個歷史,所以偶爾的改變或添加命令行僅僅是一個「麻煩」一次。從此,新的命令在歷史中可用。

我啓動emacs的配置有「嵌入式」預先定義的編譯命令:

USER_FLAGS='-O0 ' ; export USER_FLAGS ; time make CC='g++ -m64' -j 2 -k 

此命令顯示了第一時間我從emacs的內啓動編譯器。 Emacs提供它就好像該命令已經在'編譯命令歷史'中。

我手動縮短這一點,如果我不重建所有,平時我只建立一個單一的UT:

USER_FLAGS='-O0 ' ; export USER_FLAGS ; time make CC='g++ -m64' 

因此,舉例來說,當我準備編譯dumy431.cc,我調用:

USER_FLAGS='-O0 ' ; export USER_FLAGS ; time make CC='g++ -m64' dumy431 

我啓動的下一個版本(從emacs編譯中啓動)以上一個命令開始,向上/向下箭頭通過任何其他版本的命令。


利用這種形式的命令,我可以平凡從克++改變由在適當的位置插入「族」到鐺++:

USER_FLAGS='-O0 ' ; export USER_FLAGS ; time make CC='clang++ -m64' 

鐺++通常提供額外的診斷使g ++不報告。要回滾到g ++,我可以在編譯器命令面板中向上箭頭(或編輯命令)。


這是一個小例子,其中我的單元測試代碼有多個src文件。通常情況下,非主文件(如eng_format *)是我計劃捕捉到我的圖書館之一以備將來使用代碼:

FMssb.o : FMssb.cc FMssb.hh 
    @echo 
    @echo R_FMssb.o: $< 
    rm -f [email protected] 
    $(CC) $(CC_FLAGS) -c $< -o [email protected] 

FMssb_ut : FMssb_ut.cc eng_format.o FMssb.o $(LIB_ARCHIVEs) 
    @echo 
    @echo R_FMssb_ut: $< 
    rm -f [email protected] 
    $(CC) $(CC_FLAGS) $< -o [email protected] eng_format.o FMssb.o $(LIB_DIRs) $(LIB_NMs) 

eng_format.o : eng_format.cpp eng_format.hpp $(LIB_ARCHIVEs) 
    @echo 
    @echo R_EF: $< 
    rm -f [email protected] 
    $(CC) $(CC_FLAGS) -c $< -o [email protected] $(LIB_DIRs) $(LIB_NMs)