编译:Qt项目的未定义引用“clock_gettime和memcpy”

Compiling: undefined reference "clock_gettime and memcpy" for Qt project

提问人:yaa 提问时间:9/17/2017 最后编辑:valianoyaa 更新时间:10/23/2017 访问量:755

问:

我尝试使用 CentOS 编译 Qt 项目。这个问题详细描述了我做了什么,并且 我想参考这个来使用另一个 glibc 库 /users/my/lib64/(我无法更新 /lib64/)。

这是编译输出:

g++ ./main.o ./moc_widget.o ./widget.o \
  -o ./test -Wl,--rpath=/users/my/lib64 \
  -Wl,--rpath=/users/my/Qt/5.9.1/gcc_64/lib \
  -Wl,--dynamic-linker=/users/my/lib64/libc.so.6 \
  -Wl,--dynamic-linker=/users/my/lib64/libz.so.1 \
  -L/users/my/Qt/5.9.1/gcc_64/lib -lQt5Widgets \
  -lQt5Gui -lQt5Core -lGL -lpthread  -lglib-2.0 -lrt -lX11 \
  -I/users/my/test/2 \
  -I/users/my/Qt/5.9.1/gcc_64/include \
  -I/users/my/Qt/5.9.1/gcc_64/include/QtWidgets \
  -I/users/my/Qt/5.9.1/gcc_64/include/QtCore \
  -I/users/my/Qt/5.9.1/gcc_64/include/QtGui

.pro 文件:

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = test
TEMPLATE = app

DEFINES += QT_DEPRECATED_WARNINGS

CONFIG += qt

SOURCES += \
        main.cpp \
        widget.cpp 

HEADERS += \
        widget.h 

FORMS += \
        widget.ui 

GCC 版本:6.1.0

但是错误:

    /users/my/Qt/5.9.1/gcc_64/lib/libQt5Core.so: undefined reference to `clock_gettime@GLIBC_2.17'
    /users/my/Qt/5.9.1/gcc_64/lib/libQt5Widgets.so: undefined reference to `memcpy@GLIBC_2.14'
    collect2 ld returned exit 1 status

如何解决?

Qt CentOS 链接器错误 glibc 未定义引用

评论

0赞 saeed 9/17/2017
将您的文件添加到问题中,似乎是链接错误并包含您的 GCC 版本.pro
0赞 saeed 9/17/2017
我很困惑,你是想在本地机器上编译你的项目并将其部署到目标机器,还是你想在目标机器上编译项目
0赞 yaa 9/17/2017
谢谢。我修改了我的问题。很抱歉混淆了,前者是理想的,但我无法在目标机器上运行应用程序,所以我尝试后者。
0赞 saeed 9/17/2017
创建一个简单的项目并生成。我想检查一下您是否可以只构建一个简单的应用程序?
0赞 yaa 9/17/2017
我做了简单的项目,只有关闭按钮,但我使用Qtcreator并拿起发布项目,所以我对使用cui构建不太了解。

答:

0赞 Employed Russian 9/18/2017 #1
g++ ./main.o ./moc_widget.o ./widget.o \
 -o ./test -Wl,--rpath=/users/my/lib64 \
 -Wl,--rpath=/users/my/Qt/5.9.1/gcc_64/lib \
 -Wl,--dynamic-linker=/users/my/lib64/libc.so.6 \
 -Wl,--dynamic-linker=/users/my/lib64/libz.so.1 \
 -L/users/my/Qt/5.9.1/gcc_64/lib -lQt5Widgets \
 -lQt5Gui -lQt5Core -lGL -lpthread  -lglib-2.0 -lrt -lX11 \
 -I...

这个命令行完全是假的(你不明白之前的答案):只能有一个动态链接器,它应该是 ,而不是 .通过使用多个标志,您只需将以前的(不正确的)设置替换为新的(也是不正确的)设置即可。/users/my/lib64/ld-linux-x86-64.so.2libz.so.1--dynamic-linker=...

这也是虚假的,因为在没有任何来源的情况下在链接线上指定标志是没有意义的。-I...

如果此命令成功,则最终会得到一个可执行文件,该可执行文件会立即崩溃,因为它不是动态链接器。libz.so.1

现在,您的链接失败,因为您在错误的系统上执行链接。您需要在原始系统(您之前成功链接二进制文件的系统,以及具有 GLIBC 2.17 或更高版本的系统)上进行链接。然后将链接的可执行文件移动到目标系统。

在原始系统上,链接命令应如下所示:

g++ main.o moc_widget.o widget.o -o test \
   -Wl,-rpath=/users/my/lib64 \
   -Wl,--dynamic-linker=/users/my/lib64/ld-linux-x86-64.so.2 \
 -L...

我上面缩进的两行应该是与原始成功链接命令相比的唯一更改。