2017-09-17 1 views
0

Ich versuche, Qt-Projekt mit CentOS zu kompilieren. This Frage beschreiben, was ich im Detail getan habe und Ich möchte mit einem anderen glibc Bibliotheken /users/my/lib64/ (ich kann nicht aktualisieren/lib64 /) durch Bezugnahme auf this.Kompilieren: undefinierter Verweis "clock_gettime und memcpy" für Qt-Projekt

Dies ist kompilieren heraus gesetzt:

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 

.proDatei:

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

Aber der Fehler:

/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 

Wie man es löst ?

+0

fügen Sie Ihre '.pro' Datei zur Frage, scheint ein Link-Fehler und Ihre gcc-Version – saeed

+0

Ich bin verwirrt, wollen Sie Ihr Projekt auf dem lokalen Rechner kompilieren und auf dem Zielcomputer bereitstellen oder Sie möchten das Projekt kompilieren Ziel machie – saeed

+0

Danke. Ich modifiziere meine Frage. Sorry für Verwirrung, ersteres ist ideal, aber ich kann die Anwendung nicht in Zielmaschine ausführen, also versuche ich das letztere. – yaa

Antwort

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

Diese Befehlszeile ist völlig falsch (nicht previous answer verstanden haben): Es gibt nur ein dynamischen Linker sein kann, und es sollte /users/my/lib64/ld-linux-x86-64.so.2 und nicht libz.so.1 sein. Indem Sie mehrere --dynamic-linker=... Flags verwenden, werden Sie einfach ersetzen vorherige (falsche) Einstellung mit einem neuen (auch inkorrekten).

Es ist auch falsch, weil die Angabe -I... Flags auf der Zeile ohne Quellen ist sinnlos.

Wenn dieser Befehl erfolgreich war, würden Sie mit einer ausführbaren Datei enden, die einfach sofort abstürzen würde, da nicht ein dynamischer Linker ist.

Jetzt schlägt Ihr Link fehl, weil Sie den Link auf dem falschen System ausführen. Sie müssen auf dem ursprünglichen-System verknüpfen (das, wo Sie zuvor erfolgreich Ihre binäre und die, die GLIBC 2.17 oder später hat) verknüpft. Und dann verschieben Sie die verknüpfte ausführbare Datei auf Ihr Zielsystem.

auf dem ursprünglichen System, sollte Ihr Link-Befehl wie folgt aussehen:

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

Die beiden Linien I oben eingekerbt sollte die nur Wechsel von Ihrem ursprünglichen erfolgreiche Link-Befehl sein.

Verwandte Themen