Я пытаюсь связать все * .o-файлы из другой папки и хотел бы, чтобы в моем Makefile делал что-то вроде:
g++ *.o (folder/*.o and not folder/main.o) -o bin
Есть ли какой-нибудь способ использования некоторого простого простого выражения?
Попробуйте g++ *.o $( echo folder/*.o |tr ' ' "\n" | egrep -v folder/main.o ), если ни один из folder/*.o не имеет SPACES в своих именах.
Вот как это работает:
echo folder/*.o создает список имен файлов, разделенных пробелами, с каталогом. tr ' ' "\n" изменяет все пробелы на новые строки (дает нам одно имя файла в строке, что делает egrep счастливым. egrep -v folder/main.o устраняет нежелательное имя файла из этого списка. $() помещает остальные имена файлов в командной строке. $IFS по умолчанию - SPACE, TAB, NEWLINE, нам не нужно tr возвращать их в пробелы.
Вы должны использовать make-файлы или даже лучше autotools, но вы можете сделать что-то вроде этого:
ls folder/ | grep "*.o" | grep -v "main.o" | while read -r file; do g++ $file -o bin; done
Этот вопрос будет лучше отвечать в связанном с bash стеке в любом случае ха-ха.
Это должно работать:
ls -1 folder/*.o | grep -v main.o | xargs -I{} g++ {} -o bin
Объяснение:
ls -1 folder / *. o -> список всех файлов .o (по одной в строке) в папке папки grep -v main.o -> исключить main.o из списка xargs -I {} g ++ {} -o bin -> выполнить «файл g ++ -o bin»