信息:
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?
1条答案
按热度按时间g6ll5ycj1#
通过运行
make -p -f/dev/null
,你可以看到所有的内置规则。这是内置的规则,用于从
.c
文件创建.o
文件。查看输出中的其他地方,您将看到:所以这些是用来把
.c
文件编译成.o
文件的变量。