1

所以我试图将c程序的进程名称从 Crystal_capture 更改为 crystal_captured ,似乎是想保留旧的进程名称 (crystal_capture) 。

这是生成文件。

CC=gcc
CFLAGS=-c -Wall
MSFLAGS=-lpcap -I/usr/include/mysql -DBIG_JOINS=1  -fno-strict-aliasing  -g -L/usr/lib/arm-linux-gnueabihf -lmysqlclient -lpthread -lz -lm -lrt -ldl
CAPTURE=crystal_captured

all: $(CAPTURE)

$(CAPTURE): parser.o $(CAPTURE).o
     $(CC) $(MSFLAGS) parser.o $(CAPTURE).o -o $@

$(CAPTURE).o: $(CAPTURE).cpp
    $(CC) $(CFLAGS) $(MSFLAGS) $(CAPTURE).cpp

parser.o: parser.c
    $(CC) $(CFLAGS) parser.c

clean:
    rm -rf *.o $(CAPTURE)

命令 make; sudo ./crystal_captured; ps -A | grep crystal

看见 crystal_capture

那么无论如何我可以从编译中更改进程名称,而无需进入代码。

4

2 回答 2

4

经过一些调试和一些帮助,我终于弄明白了。它没有做错任何事情,只是截断了我添加到名称中的“d”。

它必须将其截断为最多 15 个字符。

于 2013-08-26T15:59:57.623 回答
3

您的 makefile 目标是$(NAME),但它输出到,/bin/$(NAME)因此将始终尝试重建目标。另外,写到/bin/意味着你正在编译为root,不要那样做。您应该输出到目标的名称:

$(NAME): $(NAME).o
     $(CC) $(CFLAGS) $(NAME).o -o $(NAME)

最简单的方法是使用引用目标的内置make变量:

$(NAME): $(NAME).o
     $(CC) $(CFLAGS) $(NAME).o -o $@

如果您希望目标位于/bin/(您不应该这样做),那么您可以执行以下操作:

/bin/$(NAME): $(NAME).o
     $(CC) $(CFLAGS) $(NAME).o -o $@

但是目标名称和创建的文件应该仍然匹配,否则你在撒谎make

您还可以使用引用第一个先决条件的内置变量:

$(NAME): $(NAME).o
     $(CC) $(CFLAGS) $< -o $@

您的 makefile 毫无意义,因为program_name.c您可以在没有 makefile 的情况下编译一个简单的程序,如下所示:

make CFLAGS=-Wall program_name

这将使用的make默认规则来编译program_name使用program_name.cgcc

你还没有说问题是什么,所以我不知道它是否与和之间的区别有关$(NAME)/bin/$(NAME)但除非你重新表述这个问题,否则实际上不可能弄清楚你所看到的以及你为什么认为它是错误的。

除非进程更改argv[0]进程名称只是可执行文件的名称,因此如果您执行,/bin/foobar则进程名称将为/bin/foobar. 如果您想更改它,只需更改可执行文件的名称,这应该不难。

于 2013-08-26T14:55:07.710 回答