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

时间:2017-09-17 07:43:01

标签: qt centos linker-errors glibc undefined-reference

我尝试用CentOS编译Qt项目。 This问题描述了我所做的细节和 我想通过引用this来处理另一个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

如何解决?

1 个答案:

答案 0 :(得分:0)

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...

此命令行完全是假的(您不理解previous answer):只能有一个动态链接器,它应该是/users/my/lib64/ld-linux-x86-64.so.2,而不是libz.so.1 {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...

上面缩进的两行应该是原始成功链接命令的更改。