Script BASH pour comstackr plusieurs fichiers C ++ – OpenCV

Veuillez consulter Fonctions d’appel dans d’autres fichiers en C ++ et OpenCV pour le problème initial. Le code que j’utilise y est donné en détail. Ceci est un sous-problème.

J’ai un script 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 comstack only .c or .cpp files" fi echo "Output file => ${1%.*}" 

Le script BASH ci-dessus est utilisé pour comstackr le code OpenCV à l’aide de ./script.sh input.cpp .
Mon doute est de savoir comment puis-je le modifier pour comstackr plusieurs fichiers en même temps, comme un autre fichier avec certaines fonctions que j’utilise dans mon code principal, comme:
./script.sh input.cpp functions.cpp


MODIFIER
Comme suggéré par John B, j’ai modifié mon script BASH pour

 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 

Mais maintenant, j’obtiens l’erreur suivante:

 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_, cv::Point_, int, int, int)' collect2: error: ld returned 1 exit status Output file => test 

Comme le suggère Jonathan Leffler , il est préférable d’utiliser un fichier makefile. Mais si vous voulez utiliser un script Bash, vous pouvez appeler tous les arguments avec $@ et effectuer une itération sur chacun d’eux.

 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 

Pour le problème déclaré en édition:

Pour que les fichiers soient compilés sans la fonction “principale”, vous devez utiliser le commutateur -c , afin que le compilateur produise des objects plutôt que des exécutables. Le processus devrait ressembler à ceci:

 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 

Quand vous avez fini les objects, il est temps de les relier

 g++ obj/* -o my_awesome_executable 

Une solution simple et simpliste:

Créez un autre fichier de script avec le contenu suivant:

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

Ensuite, lancez-le sans arguments:

 ./doit.sh 

Votre nouveau script, doit.sh, doit résider dans le même dossier que votre script.sh existant.

Veuillez envisager d’investir du temps dans l’apprentissage d’un système de construction décent, tel que cmake. Cela peut être exagéré pour un petit projet, mais cela vaut la peine d’investir lorsque la taille de vos projets augmente.

Plutôt que de déboguer, il est plus facile d’écrire. Essayez ceci:

 #!/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 comstack only .c or .cpp files" fi done exit 0