用于编译多个C ++文件的BASH脚本 - OpenCV

时间:2014-06-27 02:29:12

标签: c++ bash opencv g++

有关初始问题,请参阅Call functions in other files in C++ and OpenCV。我正在使用的代码详细说明。这是一个子问题。

我有一个BASH脚本:

echo "compiling $1"
if [[ $1 == *.c ]]
then
    gcc -ggdb `pkg-config --cflags opencv` -o `basename $1 .c` $1 `pkg-config --libs opencv`;
elif [[ $1 == *.cpp ]]
then
    g++ -ggdb `pkg-config --cflags opencv` -o `basename $1 .cpp` $1 `pkg-config --libs opencv`;
else
    echo "Please compile only .c or .cpp files"
fi
echo "Output file => ${1%.*}"

上面的BASH脚本用于使用./script.sh input.cpp编译OpenCV代码 我的疑问是如何修改它以同时编译多个文件,就像我在主代码中使用的一些函数的另一个文件一样:
./script.sh input.cpp functions.cpp


修改
正如John B所建议的那样,我将BASH脚本修改为

for f in "$@"; do
    echo "compiling $f"
    if [[ $f == *.c ]]
    then
        gcc -ggdb `pkg-config --cflags opencv` -o `basename "$f" .c` "$f" `pkg-config --libs opencv`
    elif [[ $f == *.cpp ]]
    then
        g++ -ggdb `pkg-config --cflags opencv` -o `basename "$f" .cpp` "$f" `pkg-config --libs opencv`
    else
        echo "$f is not .c or .cpp file"
    fi
    echo "Output file => ${f%.*}"
done

但是现在,我收到以下错误:

compiling draw_shapes.cpp
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
collect2: error: ld returned 1 exit status
Output file => draw_shapes
compiling test.cpp
/tmp/ccW65wuP.o: In function `main':
/home/kanishka/Desktop/opencv test/test.cpp:31: undefined reference to `draw_line(cv::Mat, cv::Point_<int>, cv::Point_<int>, int, int, int)'
collect2: error: ld returned 1 exit status
Output file => test

4 个答案:

答案 0 :(得分:1)

正如 Jonathan Leffler 建议的那样,使用makefile是更好的做法。但是如果你想使用Bash脚本,可以使用$@调用所有参数并迭代每个参数。

for f in "$@"; do
    echo "compiling $f"
    if [[ $f == *.c ]]
    then
        gcc -ggdb `pkg-config --cflags opencv` -o `basename "$f" .c` "$f" `pkg-config --libs opencv`
    elif [[ $f == *.cpp ]]
    then
        g++ -ggdb `pkg-config --cflags opencv` -o `basename "$f" .cpp` "$f" `pkg-config --libs opencv`
    else
        echo "$f is not .c or .cpp file"
    fi
    echo "Output file => ${f%.*}"
done

答案 1 :(得分:1)

编辑中陈述的问题:

要在没有“main”函数时编译文件,您需要使用-c开关,因此编译器会生成对象而不是可执行文件。过程应如下所示:

g++ $src_file1 $src_file2 -Iincludes_directory -c -o obj/object1.o
g++ $src_file3 $src_file4 -Iincludes_directory -c -o obj/object2.o
g++ $src_file5 $src_file6 -Iincludes_directory -c -o obj/object3.o
....
g++ $srcfileX $src_file_containing_main_function -Iincludes_directory -c -o obj/object_with_main.o

当您完成对象时,是时候将它们链接在一起了

g++ obj/* -o my_awesome_executable

答案 2 :(得分:0)

一个简单明了的解决方案:

使用以下内容创建另一个脚本文件:

./script.sh input.cpp
./script.sh functions.cpp

然后,不带参数运行它:

./doit.sh

您的新脚本doit.sh必须与现有script.sh位于同一文件夹中。

请考虑投入时间学习体面的构建系统,例如cmake。对于一个小项目来说,这可能是一种过度杀伤,但是当你的项目规模扩大时,它就值得投资。

答案 3 :(得分:0)

不是调试,而是更容易编写。放手一搏:

#!/bin/bash

test -n "$1" || { echo "error: insufficient input, usage :${0##*/} filename.c (cpp)"; exit 1; }

for source in "$@"; do

    ext="${source##*\.}"  # file extension
    fname="${source##*/}" 
    fname="${fname%\.*}"  # base filename (no extension)

    if test "$ext" == "c" ; then

        gcc -ggdb `pkg-config --cflags opencv` \
        -o "$fname" "$source" \
        `pkg-config --libs opencv`

    elif test "$ext" == "cpp" ; then

        g++ -ggdb `pkg-config --cflags opencv` \
        -o "$fname" "$source" \
        `pkg-config --libs opencv`

    else
        echo "Please compile only .c or .cpp files"

    fi

done

exit 0