我有一个不能正确链接的C项目,我怀疑这是因为gcc传递给ld程序的--as-needed标志.由于该标志,gcc将*.c文件之前列为选项的任何链接库视为不必要,并且不会链接它们.
PREFIX?=/usr/local
CFLAGS=-D_LARGEFILE64_SOURCE=1 -g -Wall -I${PREFIX}/apr/include/apr-1 -I${PREFIX}/apr/include/apr-util-1
LDFLAGS=-lapr-1 -pthread -laprutil-1
all: devpkg
devpkg: bstrlib.o db.o shell.o commands.o
install: all
install -d $(DESTDIR)/$(PREFIX)/bin/
install devpkg $(DESTDIR)/$(PREFIX)/bin/
clean:
rm -f *.o
rm -f devpkg
rm -rf *.dSYM
Run Code Online (Sandbox Code Playgroud)
当我运行这个makefile时,我得到以下内容.
cc -D_LARGEFILE64_SOURCE=1 -g -Wall -I/usr/local/apr/include/apr-1 -I/usr/local/apr/include/apr-util-1 -c -o bstrlib.o bstrlib.c
cc -D_LARGEFILE64_SOURCE=1 -g -Wall -I/usr/local/apr/include/apr-1 -I/usr/local/apr/include/apr-util-1 -c -o db.o db.c
cc -D_LARGEFILE64_SOURCE=1 -g -Wall -I/usr/local/apr/include/apr-1 -I/usr/local/apr/include/apr-util-1 -c -o shell.o shell.c
cc -D_LARGEFILE64_SOURCE=1 -g -Wall -I/usr/local/apr/include/apr-1 -I/usr/local/apr/include/apr-util-1 -c -o commands.o commands.c
cc -D_LARGEFILE64_SOURCE=1 -g -Wall -I/usr/local/apr/include/apr-1 -I/usr/local/apr/include/apr-util-1 -lapr-1 -pthread -laprutil-1 devpkg.c bstrlib.o db.o shell.o commands.o -o devpkg
/tmp/ccZcAm9b.o: In function `main':
/home/zach/Desktop/devpkgzed/devpkg.c:14: undefined reference to `apr_pool_initialize'
/home/zach/Desktop/devpkgzed/devpkg.c:15: undefined reference to `apr_pool_create_ex'
/home/zach/Desktop/devpkgzed/devpkg.c:29: undefined reference to `apr_getopt_init'
/home/zach/Desktop/devpkgzed/devpkg.c:31: undefined reference to `apr_getopt'
Run Code Online (Sandbox Code Playgroud)
我的问题是我真的不明白如何make
通过设置的CFLAGS提出这些命令.如何让链接器选项跟随编译部分而不是相反,这会触发此问题?
Make具有内置规则来编译源文件和链接可执行文件和库.您列出的命令由这些规则生成.
您失败的原因是,在链接时,库应该在目标文件之后列出,因为链接器会对其参数进行单次传递,并且会丢弃在查看它们时未解析的任何符号.要纠正它,把你的库中LDLIBS
的变量,而不是LDFLAGS
变量(即只需更换LDFLAGS
的LDLIBS
).的LDFLAGS
变量是指非库选项为连接基团,如-L
或-shared
等