我想创建一个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
,targ2
和targ3
,将仅为所有目标构建一次依赖关系,并将以正确的顺序构建所有内容等。
我不清楚为什么要从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 &