GCC:未链接文件

3
我有main.c、snmpy.c、snmpy.o和一个makefile。我通过命令行在Linux服务器上运行它。以下是它们的内容...
main.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();

makefile:
# 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

不确定发生了什么,是否有我没有做对的事情,或者我没有安装某些东西。我对制作make文件是个新手。我已经有一段时间没有做过了。
提前感谢!
3个回答

8

回复:

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

命令中的-c选项表示编译(但不链接)。 这将生成.o(对象)文件。
尝试不使用-c命令,它应该链接并创建您的snmpy可执行文件。

@RobAveryIV 好消息啊 - 刚开始为什么不起作用了呢? - Levon
哈哈,当我使用vi的时候,我忘记保存了。后来我重新进入了vi并去掉了-c选项然后保存了。只是一点用户错误。 - Rob Avery IV

4

通过以下方式:

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

因为 CFLAGS 包含了一个 -c,所以在链接阶段中也需要使用 -c。你真正需要的是:
$(PROG): $(OBJS)

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

您可能也可以省略*.o目标。


3
您需要取消 -c 选项才能进行完整的链接。 -c 只会导致源文件编译为 *.o 文件。
以下是 man gcc 命令对 -c 选项的解释: -c 编译或汇编源文件,但不进行链接。链接阶段将不会执行。最终输出的形式是每个源文件的目标文件。
默认情况下,源文件的目标文件名是通过将后缀 .c、.i、.s 等替换为 .o 来生成的。
不需要编译或汇编的无法识别的输入文件将被忽略。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接