我尝试用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
如何解决?
答案 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...
上面缩进的两行应该是原始成功链接命令的仅更改。