2017-09-17 7 views
0

Je tente de compiler le projet Qt avec CentOS. This question décrivent ce que j'ai fait en détail et je veux faire avec une autre bibliothèques glibc /users/my/lib64/ (je ne peux pas mettre à jour/lib64 /) en se référant à this.Compilation: référence non définie "clock_gettime et memcpy" pour le projet Qt

C'est la compilation eteint:

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 

fichier .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 version: 6.1.0

Mais l'erreur:

/users/my/Qt/5.9.1/gcc_64/lib/libQt5Core.so: undefined reference to `[email protected]_2.17' 
    /users/my/Qt/5.9.1/gcc_64/lib/libQt5Widgets.so: undefined reference to `[email protected]_2.14' 
    collect2 ld returned exit 1 status 

Comment le résoudre ?

+0

ajouter votre fichier '.pro' à la question, semble une erreur de lien et inclure votre version gcc – saeed

+0

Je suis confus voulez-vous compiler votre projet dans la machine locale et le déployer sur la machine cible ou vous voulez compiler le projet dans cible machie – saeed

+0

Merci. Je modifie ma question. Désolé pour la confusion, le premier est idéal, mais je ne peux pas exécuter l'application dans la machine cible, donc j'essaie le dernier. – yaa

Répondre

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

Cette ligne de commande est complètement faux (vous n'avez pas compris previous answer): il ne peut y avoir un éditeur de liens dynamique, et il devrait être /users/my/lib64/ld-linux-x86-64.so.2, et non libz.so.1. En utilisant plusieurs indicateurs --dynamic-linker=..., vous êtes simplement en remplaçant le réglage précédent (incorrect) avec un nouveau (également incorrect).

Il est également faux parce que la spécification de -I... drapeaux sur la ligne lien sans aucune source est inutile.

Si cette commande réussissait, vous finiriez avec un exécutable qui se bloquerait immédiatement immédiatement, car libz.so.1 est et non un éditeur de liens dynamique.

Maintenant, votre lien échoue parce que vous effectuez le lien sur le mauvais système. Vous devez faire un lien sur le système original (celui où vous avez lié votre binaire plus tôt, et celui qui a GLIBC 2.17 ou plus tard). Puis déplacez l'exécutable lié vers votre système cible.

Sur le système d'origine, votre commande lien devrait ressembler à quelque chose comme ceci:

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

Les deux lignes ci-dessus, je dentelées devrait être la seule changement de votre commande lien avec succès d'origine.