我有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
不确定是否有什么东西我做得不对,或者我没有安装什么东西。我是制作文件的小伙子。我有一段时间没有这样做过。
提前致谢!!
答案 0 :(得分:5)
回复:
/usr/bin/gcc -c -g -std=c99 -Wall snmpy.o main.o -o snmpy
命令中的-c
选项意味着编译(但不要链接)。结果将是.o
(对象)文件。
尝试不使用-c
的命令,它应该链接并创建snmpy
可执行文件。
答案 1 :(得分:4)
通过: -
# Build the executable file
$(PROG): $(OBJS)
$(CC) $(CFLAGS) $(OBJS) -o $(PROG)
由于CFLAGS
包含-c
,您说在链接阶段也使用-c
。
你真的想要: -
$(PROG): $(OBJS)
Make应该为你做其余的事。
你也可能失去*.o
目标。
答案 2 :(得分:2)
您需要丢失-c
选项才能进行完整链接。 -c
只会导致源文件被编译为*.o
个文件。
这是man gcc
调用关于-c
选项
-c 编译或汇编源文件,但不要链接。链接 阶段根本就没有完成。最终的输出形式是 每个源文件的目标文件。
默认情况下,源文件的目标文件名由 用.o。
替换后缀.c,.i,.s等无法识别的输入文件,不需要编译或汇编, 被忽略了。