2013-03-18 92 views
1

我有很多C++程序彼此不相關,每個程序只有一個文件。目錄結構是這樣的:如何使用find編譯所有子目錄中的所有文件?

dir1 
    program1.cpp 
    program1.h 
    program2.cpp 
    program2.h 
dir2 
    program3.cpp 
    program3.h 
    program4.cpp 
    program4.h 
dir3 
    program5.cpp 
    program5.h 
    program6.cpp 
    program6.h 
.. 

我試圖想出一個shell腳本來編譯所有這些,給可執行文件不同的名稱。我一直find像這樣嘗試此:

find . -type f -name *.cpp -exec g++ -llibname '{}' \; 

這編譯所有的文件,但每個文件所以我最終只有一個最終可執行產生a.out。我如何去除文件擴展名並將其作爲可執行文件名? (例如,用於program1.cpp我需要g++ program1.cpp -o program1

回答

3

你可以做這樣的事情:

find . -type f -name '*.cpp' -exec sh -c 'g++ {} -o $(basename {} .cpp)' \; 

這將會把所有的可執行文件在您啓動該命令的目錄。如果你寧願讓他們在同一個目錄中的源文件,這應該這樣做:

find . -type f -name '*.cpp' -exec sh -c 'g++ {} -o $(dirname {})/$(basename {} .cpp)' \; 

(記得引用文件名模式,否則你的命令將開始打破,如果你有一個.cpp文件。當前目錄)

+0

的偉大工程,非常感謝.. – none 2013-03-18 10:12:36

1

你還可以嘗試:

find . -type f -name '*.cpp'| sed 's/.cpp$//' | xargs make 
+0

我不明白'xargs的make'一部分。我沒有這些程序的makefile。 – none 2013-03-18 10:56:34

+0

'make/path/to/xyz'會嘗試運行'gcc /path/to/xyz.cpp -o/path/to/xyz'默認...試試吧..至少在ubuntu上運行.. – anishsane 2013-03-18 12:20:13

+0

當我在'xyz'文件夾中嘗試'make xyz'時,它會嘗試'cc linux64 xyz.c -o xyz',然後嘗試'cc:error:linux64:No such file or directory'。如果以某種方式,我可以刪除'linux64'我也可以使用這個。非常有趣的東西順便說一句,+1 – none 2013-03-18 12:29:24

相關問題