linux 在链接之前进行扩展和编译时,如何使用变量?

zqdjd7g9  于 2022-12-22  发布在  Linux
关注(0)|答案(1)|浏览(154)

信息:

Linux watvde0453 3.10.0-1062.1.1.el7.x86_64 #1 SMP Fri Sep 13 22:55:44 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

GNU Make 4.2.1
Built for x86_64-pc-linux-gnu

你好
我一直在摆弄一个make文件,以允许构建共享的静态库和一个exe(也是为了对它的工作原理有一些了解),并遇到了一些我不理解的行为。
我试图将用于lib / exe的标志分离为单独的变量,但是当使用一行代码来编译和链接所有内容时,看起来只有CFLAGS变量被包括在编译步骤中。
使用以下生成文件时:

LIBCFLAGS := -fPIC
CFLAGS := -O3 -g -Wall -Werror
CC := gcc 
SRCS=hashfunction.c hashtable.c hashtablelinkedlist.c
OBJS=hashfunction.o hashtable.o hashtablelinkedlist.o
LIBSO  = lib$(NAME).so

libso: $(OBJS)
    $(CC) $(LIBCFLAGS) $(CFLAGS) -shared -o $(LIBSO) $(OBJS)

在运行libso的make命令时,我得到了以下输出:

$ make libso
gcc -O3 -g -Wall -Werror   -c -o hashfunction.o hashfunction.c
gcc -O3 -g -Wall -Werror   -c -o hashtable.o hashtable.c
gcc -O3 -g -Wall -Werror   -c -o hashtablelinkedlist.o hashtablelinkedlist.c
gcc -fPIC -O3 -g -Wall -Werror -shared -o lib.so hashfunction.o hashtable.o hashtablelinkedlist.o
/tools/oss/packages/x86_64-centos7/binutils/default/bin/ld: hashtable.o: relocation R_X86_64_32 against `.rodata.str1.8' can not be used when making a shared object; recompile with -fPIC
hashtable.o: error adding symbols: Bad value
collect2: error: ld returned 1 exit status
make: *** [Makefile:12: libso] Error 1

我可以通过把所有的旗帜都贴在CFLAGS上来让它工作,但我想知道是否有人能解释一下make在下面做什么?
看起来$(LIBCFLAGS)在隐式编译行中被忽略了,但$(CFLAGS)没有。make是否在所有编译中都隐式使用CFALGS?

g6ll5ycj

g6ll5ycj1#

通过运行make -p -f/dev/null,你可以看到所有的内置规则。

%.o: %.c
#  recipe to execute (built-in):
        $(COMPILE.c) $(OUTPUT_OPTION) $<

这是内置的规则,用于从.c文件创建.o文件。查看输出中的其他地方,您将看到:

COMPILE.c = $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c

所以这些是用来把.c文件编译成.o文件的变量。

相关问题