2013-03-18 48 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

相关问题