【问题标题】:gcc: not linking filesgcc:不链接文件
【发布时间】:2012-08-16 18:32:38
【问题描述】:

我有 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();

制作文件:

# 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

不确定是我做错了什么,还是我没有安装什么。我是制作文件的菜鸟。我有一段时间没做过了。

提前致谢!!

【问题讨论】:

    标签: c gcc linker


    【解决方案1】:

    回复:

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

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

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

    【讨论】:

    • @RobAveryIV 嗯,这是个好消息 - 发生了什么,它没有先起作用?
    • 大声笑,当我使用 vi 时,我忘了保存。我回到 vi 并删除了 -c 并保存了它。只是一点点用户错误。
    【解决方案2】:

    通过这样做:-

    # 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。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-12-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-09-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多