makefile - Ubuntu LDFLAGS --按需

标签 makefile

我有一个无法正确链接的 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

当我运行这个 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'

我的问题是我真的不明白 make正在通过设置的 CFLAGS 提出这些命令。我怎样才能让链接器选项跟随编译部分而不是相反,这会触发这个问题?

最佳答案

Make 具有编译源文件和链接可执行文件和库的内置规则。您列出的命令是由这些规则生成的。

这对您来说失败的原因是,在链接时,库应该列在目标文件之后,因为链接器只通过它的参数进行一次传递,并且会丢弃任何在看到它们时未解析的符号。要更正它,请将您的库放入 LDLIBS变量,而不是 LDFLAGS变量(即只需将 LDFLAGS 替换为 LDLIBS )。 LDFLAGS变量用于链接器的非库选项,例如 -L-shared等等

关于makefile - Ubuntu LDFLAGS --按需,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11596044/

相关文章:

c - 如何解释 make 命令生成的输出?

linux - 与 GNU Make 链接时参数列表太长

makefile - GNU make 中递归作业的并行化

c++ - 链接器找不到 -lglut

shell - 如何在 Unix 上的 Makefile 中获取文件大小?

c - 这个简单的 Makefile 有什么问题吗?

c++ - 如果使用 Makefile 编译,代码可以正常工作,如果使用 XCode 编译,代码会崩溃

c - Makefile C 子目录规则来制作 obj

c - 使用 makefile 编译时,如何在不使用命令 'make clean' 的情况下清理目标文件?

makefile - make 运行所有目标