对“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”的引用