我正在从源代码构建一些东西,并且在运行 make 时得到以下输出:
...
CC libpromises_la-mod_outputs.lo
CC libpromises_la-unix.lo
CCLD libpromises.la
CC cfknow.o
CC manual.o
CCLD cf-know
./.libs/libpromises.so: undefined reference to `dlerror'
./.libs/libpromises.so: undefined reference to `dladdr'
./.libs/libpromises.so: undefined reference to `dlclose'
./.libs/libpromises.so: undefined reference to `dlopen'
./.libs/libpromises.so: undefined reference to `dlsym'
collect2: ld returned 1 exit status
gmake[2]: *** [cf-know] Error 1
gmake[2]: Leaving directory `/tmp/cfengine/cfengine-3.1.5/src'
gmake[1]: *** [all] Error 2
gmake[1]: Leaving directory `/tmp/cfengine/cfengine-3.1.5/src'
gmake: *** [all-recursive] Error 1
我谷歌了一下,似乎链接器找不到某些文件。我从来没有处理过这样的事情,所以我想知道是否有人可以帮助我解码此消息并深入了解找不到哪个文件以及如何告诉链接器它在哪里。
我知道引用来自libpromises.so
,这是一个二进制文件。因此,在 vi 中打开它只会得到乱码。我应该寻找libpromises.h
? libpromises.c
?
答案1
您应该能够编辑 Makefile 并快速完成此操作。
注意 - 假设 Makefile 是由 GNU Autotools 制作的。根据 Cfengine tarball,确实如此。
首先,打开 Makefile 并查找标志LDFLAGS
。它应该看起来像这样:
LDFLAGS=-lfoo -lbar
附加到该列表-ldl
。这将添加对动态加载库的引用。
重新编译,链接器应该能够完成它的工作。
LIBS 环境变量是一个环境变量,它告诉./configure
需要哪些额外的库,然后它会粘贴到 Makefile 中(因此,回答你的问题,./configure
实际上并没有运行链接器- 它生成 Makefile,并使用gcc
从 ) 获得的参数运行./configure
。
因此,使用LIBS=-ldl && ./configure
。