对“dlopen”的未定义引用

Posted

技术标签:

【中文标题】对“dlopen”的未定义引用【英文标题】:undefined reference to `dlopen' 【发布时间】:2011-05-31 06:44:02 【问题描述】:

我有一个不使用现代 GCC 构建的程序,输出很愚蠢:

gcc -I/usr/lib/qt3/include -I/opt/kde3/include/  -fmessage-length=0 -O2 -Wall -D_FORTIFY_SOURCE=2 -fstack-protector -funwind-tables -fasynchronous-unwind-tables -lqt-mt -ldl -L/usr/lib/qt3/lib64 -o autocheck autocheck.cpp
autocheck.cpp: In function 'int main(int, char**)':
autocheck.cpp:64:62: warning: too many arguments for format
autocheck.cpp:79:79: warning: too many arguments for format
/tmp/ccOFReGf.o: In function `main':
autocheck.cpp:(.text+0x244): undefined reference to `dlopen'
autocheck.cpp:(.text+0x2e1): undefined reference to `dlerror'
collect2: ld returned 1 exit status

我在 Internet 上搜索了建议,但只找到了将 -ldl 添加到链接器的建议。但这在这里没有帮助。我该怎么办?

【问题讨论】:

这很奇怪。请尝试在一个最小示例上重现该问题,即一个只调用 dlopen 并且不执行任何其他操作的小程序。 关于 -ldl 作用的任何信息? 【参考方案1】:

移动 autocheck.cpp 使其位于命令中的库之前。仅在库中搜索需要在出现在它们之前的文件中解析的内容。所以你的命令应该是这样的:

gcc autocheck.cpp -I/usr/lib/qt3/include -I/opt/kde3/include/  -fmessage-length=0 -O2 -Wall -D_FORTIFY_SOURCE=2 -fstack-protector -funwind-tables -fasynchronous-unwind-tables -lqt-mt -ldl -L/usr/lib/qt3/lib64 -o autocheck 

【讨论】:

@neil-butterworth 根据我的经验,这仅适用于静态库。在我的机器上g++ -ldl -o foo foo.cpp 有效(foo.cpp 确实引用了 dlopen)。 如何知道要配置什么? @n.m 我不知道 libdl 是静态库还是动态库,但无论如何这是一个好习惯。 我在 LDFLAGS 和 LIBS 环境变量中添加了 -ldl 但这没有帮助:两者都将 -ldl 放在 cpp 文件之前。 而且 -lqt-mt 在放置在文件之前时也会以某种方式工作,所以我怀疑错误的原因在于选项的放置。

以上是关于对“dlopen”的未定义引用的主要内容,如果未能解决你的问题,请参考以下文章

试图在 C++ 中嵌入 Lua,“未定义对 'dlopen' 的引用”

编译错误 未定义的引用 怎么回事

解决:linux eclipse 对‘dlopen’未定义的引用, 对‘xxx’未定义的引用

linux + visual studio 2013 + visualgdb,未定义对“dlopen”的引用

C:尽管添加了 `-ldl` 标志,但未定义对 `dlopen`/`dlsym` 的引用

对结构方法的未定义引用[重复]