Для компиляции общих файлов для двух исполняемых файлов одновременно вам нужно создать Makefile или другой сценарий сборки, который учитывает зависимости файлов и указывает компилятору, какие файлы нужно скомпилировать только один раз.
Пример Makefile:
```Makefile
CC = g++
CFLAGS = -Wall -g
TARGETS = app test
all: $(TARGETS)
app: a.o common.o
$(CC) $(CFLAGS) a.o common.o -o app
test: b.o common.o
$(CC) $(CFLAGS) b.o common.o -o test
a.o: a.cpp
$(CC) $(CFLAGS) -c a.cpp
b.o: b.cpp
$(CC) $(CFLAGS) -c b.cpp
common.o: common.cpp
$(CC) $(CFLAGS) -c common.cpp
clean:
rm -f *.o $(TARGETS)
```
Здесь common.o компилируется только один раз, а затем используется как зависимость для компиляции исполняемых файлов app и test. Для создания исполняемых файлов достаточно выполнить команду `make`.
Вы также можете использовать другие средства сборки, такие как CMake или Meson, чтобы автоматизировать процесс сборки проекта, включая компиляцию общих файлов только один раз.