C语言 后台运行make



我想创建一个C程序来从同一个Makefile中创建几个不同的可执行二进制文件,它们具有不同的名称。

但是每次我运行"make"在一个相当大的程序中,他们有一堆日志输出…如果我做几个这样的终端会很"脏">

问题是,是否可以运行"make"在后台,这样我就不用看到那些日志了?这是个好主意吗?还是说这和把它放到背景里没有关系?

,如果是,我该怎么做?

对于程序,它或多或少像下面这样,其中tmp2是二进制名称

的数组。
for (int j = 0; tmp2[j] != NULL; j++)
{
printf("-> %sn", tmp2[j]);
char command[128] = "";
sprintf(command, "make -C %s TARGET=%s all", "file/path/", tmp2[j]);
system(command);
}

,我试图查找在后台运行linux命令,如添加&在命令的末尾,但它仍然显示日志

text.c:442:3: warning: blablabla
gcc -W -Wall -Wextra -c -g -Os -I. test1.c
gcc -W -Wall -Wextra -c -g -Os -I. test2.c
gcc -g -o STEM_ECS2_SERVICE_3 main.o json.o config.o debug.o -lnsl  -lm -ldl -lc -lmysqlclient  -lm
/bin/mv *.o ./object

日志是上面的东西,它的简化版本,它只是所有的东西从-Wall和实际的命令,如gcc的东西

有没有办法让我们看不见"make"日志吗?

编辑

为make文件

include ../../Make.cf
OBJ_DIR         = ./object
CFLAGS      = -g -Os $(INCDIR) $(MYSQLINC) -I./include -export-dynamic
LDFLAGS     = $(SYSNLIB) $(SYSLIB) $(MYSQLLIB) $(THREADLIB) -L$(LIBDIR) 
-lmysqlclient  -lm 
C_OBJECTS   =   main.o              
json.o              
ecs_config.o        
ecs_debug.o         
######### define target #########
all:    $(TARGET)
main.o: main.c
$(CC) -W -Wall -Wextra -c $(CFLAGS) $(DEFINES) main.c
json.o: json.c
$(CC) -W -Wall -Wextra -c $(CFLAGS) $(DEFINES) json.c
config.o: config.c
$(CC) -W -Wall -Wextra -c $(CFLAGS) $(DEFINES) config.c
debug.o: debug.c
$(CC) -W -Wall -Wextra -c $(CFLAGS) $(DEFINES) debug.c
$(TARGET):   $(C_OBJECTS)
$(CC) $(CFLAGS) $(DEFINES) -std=gnu99 -o $(TARGET) $(C_OBJECTS) $(LDFLAGS)
$(MV) *.o $(OBJ_DIR)
touch:
$(TOUCH) *.c
clean:
$(RM) $(OBJ_DIR)/*.o
rm -f *.o core $(TARGET)
cp:
cp -f $(TARGET) $(BINDIR)/$(TARGET)

所以这个make文件实际上是由组中的其他人制作的,我不能真正显示东西的确切路径,但希望这有助于

首先,与不同的make实例并行运行相同的make/makefile可能会导致竞态条件——所以不,这不是一个好主意。(如。如果make的实例1试图访问实例2正在更新的依赖项,则可能会导致数据损坏

话虽如此,你可以通过使用make as so的一个实例来解决这个问题:

make -j targ1 targ2 targ3

这将构建targ1,targ2targ3,将仅为所有目标构建一次依赖关系,并将以正确的顺序构建所有内容等。

我不清楚为什么要从c文件中调用它,而不是仅仅使用命令行,但是如果有这样的原因,您会希望它看起来像:

char command[1024] = "";
char *eo_command =  command + sizeof(command);
char *ptr = command;
ptr += snprintf(command, sizeof(command) "make -C %s", "file/path/");
// add some checks to ptr here...
for (int j = 0; tmp2[j] != NULL; j++) {
ptr += snprintf(ptr, eo_command-ptr, " %s", tmp2[j]);
// add some checks to ptr here...
}
system(command);

如果您不想看到输出,您可以将输出管道传输到/dev/null。此外,如果你想让它构建得更快,你可以将-j标志传递给make命令行,这将允许它并行构建多个目标。

我要结束这个问题,因为我认为@Someprogrammerdude给出的解决方案最适合我的问题。

所以我确实通过稍微改变代码来解决这个问题

for (int j = 0; tmp2[j] != NULL; j++)
{
printf("-> %sn", tmp2[j]);
char command[128] = "";
sprintf(command, "make -C %s TARGET=%s all 2> make_error_log.txt > make_log.txt", "file/path/", tmp2[j]);
system(command);
}

虽然,既然Bodo提到了它,我也要学习shell脚本。谢谢你的帮助

可以调用make命令,并在最后调用&,这样进程就会在后台生成,您就会得到PID。

像这样:make -SOME_FLAGS &

最新更新