2017-07-10 75 views
1

我试图编译我的代码,但它不工作。我得到这个在学校编译,但我不能编译我的家用电脑。我似乎无法弄清楚为什么。我需要修正这个错误才能继续我的任务。此外,这个list.o文件是profs文件。我必须使用这个文件。我是一名管理我的linux的初学者。请和我一起裸照。GCC与.o文件链接

我试过的解决方案有点类似? 我已经将gcc更新为gcc-7。 我所在的libc.a

/usr/lib/x86_64-linux-gnu/libc.a 
/usr/share/doc/libklibc/README.klibc.arch 

编辑:我曾尝试没有-fPIC

编译
gcc -m64 -pthread -Wall -std=c99 -o run main.o as2.o list.o 
/usr/bin/ld: list.o: relocation R_X86_64_32S against undefined symbol... 

这是从终端: `

gcc -m64 -pthread -Wall -std=c99 -fPIC -o run main.o as2.o list.o 
/usr/bin/ld: list.o: relocation R_X86_64_32S against undefined symbol `headlist' can not be used when making a shared object; recompile with -fPIC 
/usr/bin/ld: final link failed: Nonrepresentable section on output 
collect2: error: ld returned 1 exit status 

`

这是我的文件: `

CC = gcc 
CFLAGS = -m64 -pthread -Wall -std=c99 -fPIC 
PROG = run 
OBJS = main.o as2.o list.o 

run: $(OBJS) 
    $(CC) $(CFLAGS) -o $(PROG) $(OBJS) 

main.o: main.c list.h as2.h 
    $(CC) $(CFLAGS) -c main.c 

as2.o: as2.c as2.h list.h 
    $(CC) $(CFLAGS) -c as2.c 

clean: 
    rm main.o as2.o run 

`

这是我包括: `

#include <netinet/in.h> 
    #include <sys/socket.h> 
    #include <netdb.h> 
    #include <unistd.h> 
    #include <stdio.h> 
    #include <stdlib.h> 
    #include <string.h> 
    #include <pthread.h> 
    #include "list.h" 
    #include "as2.h" 

`

任何想法/解决方案?非常感谢你!

+0

我的猜测是'list.o'编译时没有'-fPIC',混合对象有和没有这个标志不是一个好主意。尝试重新编译_without_该标志。 – rodrigo

+0

@rodrigo谢谢你的回复!我忘了提及,我也曾尝试在没有-fPIC的情况下进行编译。它仍然无法工作。 gcc -m64 -pthread -Wall -std = c99 -o运行main.o as2.o list.o /usr/bin/ld:list.o:重定位R_X86_64_32S针对未定义的符号 – elam

+0

嗯,您添加的行编辑不会编译任何东西,它正在链接。您可以尝试编译并链接所有文件,而不使用-fPIC,以防万一... – rodrigo

回答

-1

编辑: 将拼写从LFLAGS更改为LDFLAGS以安抚一些意见。

编辑: 移动-c选项来安抚一些评论。

注意:all通常是make文件中的第一个目标。

注意:使用:=而不是=所以宏只能评估一次。

注意:list.o已经在当前目录中可用(根据OP问题),因此不会在makefile中编译。但是只与其他目标文件链接以生成可执行文件

你的makefile似乎有一些疏漏。建议:

CC := gcc 
RM := rm -f 

CFLAGS := -ggdb -m64 -pthread -Wall -Wextra -pedantic -std=c99 
#LDFLAGS := <-- use the default value 

PROG := run 
OBJS := main.o as2.o list.o 
HDRS := list.h as2.h 



.PSEUDO: all clean 

all: $(PROG) 

$(PROG): $(OBJS) 
    $(CC) -ggdb -o $(PROG) $(OBJS) $(LDFLAGS) 

main.o: main.c $(HDRS) 
    $(CC) $(CFLAGS) -c main.c -o main.o -I. 

as2.o: as2.c $(HDRS) 
    $(CC) $(CFLAGS) -c as2.c -o as2.o -I. 

clean: 
    $(RM) main.o as2.o run 
+0

不要在'CFLAGS'中放置'-c',它会限制可以使用的地方。另外,你不想向初学者解释你做了什么改变,为什么? –

+0

IMO:把-c标志放在CFLAGS中,为什么,因为编译是CFLAGS应该被提及的唯一时间。对于链接,有LFLAGS(它应该放在链接命令行末尾) – user3629249

+0

hey user362949,什么是-ggdb,-m64,-Wextra,-pendantic,-I。 ?这些对我来说会如何帮助我? – elam