2

我有 main.c、snmpy.c、snmpy.o 和一个 makefile。我通过命令行在 Linux 服务器上运行它。这是所有这些...

主.c:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "snmpy.h"

int main(void) {

   char* message = sayHello();

   printf("%s", message);

   return 0;
}

snmpy.c:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "snmpy.h"

char* sayHello(){

   char* hiya = "Hello!!\n";

   return hiya;

}

snmpy.h:

char* sayHello();

生成文件:

# Compiler
CC = /usr/bin/gcc

# Name of program
PROG = snmpy

# The name of the object files
OBJS = snmpy.o main.o

# All the header and c files
SRCS = main.c snmpy.c
HDRS = snmpy.h

# Add -I to the dir the curl include files are in
CFLAGS = -c -g -std=c99 -Wall

# Build the executable file
$(PROG): $(OBJS)
        $(CC) $(CFLAGS) $(OBJS) -o $(PROG)

# Seperately compile each .c file
main.o: main.c snmpy.h
        $(CC) $(CFLAGS) -c main.c

snmpy.o: snmpy.c snmpy.h
        $(CC) $(CFLAGS) -c snmpy.c

# Clean up crew
clean:
        rm -fv core* $(PROG) $(OBJS)

cleaner: clean
        rm -fv #* *~

当我编译它时,它给了我这个错误:

/usr/bin/gcc -c -g -std=c99 -Wall snmpy.o main.o -o snmpy
gcc: snmpy.o: linker input file unused because linking not done
gcc: main.o: linker input file unused because linking not done

不知道发生了什么事情是我做的不对,或者我没有安装什么东西。我是制作文件的菜鸟。我有一段时间没做过了。

提前致谢!!

4

3 回答 3

7

回覆:

/usr/bin/gcc -c -g -std=c99 -Wall snmpy.o main.o -o snmpy

命令中的-c选项表示编译(但不链接)。其结果将是.o(对象)文件。

尝试不带 的命令-c,它应该链接并创建您的snmpy可执行文件。

于 2012-08-16T18:34:21.247 回答
4

通过做:-

# Build the executable file
$(PROG): $(OBJS)
    $(CC) $(CFLAGS) $(OBJS) -o $(PROG)

因为也CFLAGS包含-c你说过要-c在链接阶段使用的一个。

你真的想要:-

$(PROG): $(OBJS)

Make应该为您完成其余的工作。

你也可能会失去*.o目标。

于 2012-08-16T18:40:43.240 回答
3

您需要失去-c进行完整链接的选项。这-c只会导致源文件被编译成*.o文件。

这就是man gcc电话所说的关于该-c选项的内容

-c 编译或汇编源文件,但不链接。链接阶段根本没有完成。最终输出是每个源文件的目标文件形式。

默认情况下,源文件的目标文件名是通过将后缀 .c、.i、.s 等替换为 .o 来创建的。

无法识别的输入文件,不需要编译或汇编,将被忽略。

于 2012-08-16T18:36:26.617 回答