[Gelöst] Cmake führt weder moc noch uic aus

Alles rund um die Programmierung mit Qt
Antworten
LordBernhard
Beiträge: 15
Registriert: 3. Februar 2008 16:40

[Gelöst] Cmake führt weder moc noch uic aus

Beitrag von LordBernhard » 11. September 2010 11:10

Hallo!

Bei einem meiner Projekte, welches ich vor kurzem umstrukturiert habe, führt CMake nun weder uic noch moc aus, was klarerweise zu einem Abbruch des build vorganges führt da CMake dann die entsprechenden includes nicht findet (moc.cxx und ui_.h)

Irgendjemand irgendwelche ideen?... Ich versuche bereits seit längerer Zeit dieses Problem zu lösen, aber bisher ohne Erfolg...
Ich vermute es liegt an meiner ziemlich verschachtelten Ordnerstruktur, aber das muss doch möglich sein oO

Ich würde mich sehr freuen über antworten :)

Mfg,
Bernhard
Dateianhänge
moc_error.zip
kleinstmögliches Projekt mit exakt dem selben Aufbau den ich benötige
Im build ordner "cmake .." ausführen um den Fehler zu reproduzieren
(3.34 KiB) 15-mal heruntergeladen
Zuletzt geändert von LordBernhard am 11. September 2010 16:13, insgesamt 2-mal geändert.

franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf » 11. September 2010 11:32

Ich nehme an, dir fehlt einfach QT4_WRAP_CPP() (->moc) resp. QT4_WRAP_UI() (->uic).
In der CMake-Doku findest du mehr dazu.

Sollte dich das nicht weiterbringen (was ich nicht glaube), solltest du dein CMakeLists.txt posten.

LordBernhard
Beiträge: 15
Registriert: 3. Februar 2008 16:40

Beitrag von LordBernhard » 11. September 2010 11:34

franzf hat geschrieben:Ich nehme an, dir fehlt einfach QT4_WRAP_CPP() (->moc) resp. QT4_WRAP_UI() (->uic).
In der CMake-Doku findest du mehr dazu.

Sollte dich das nicht weiterbringen (was ich nicht glaube), solltest du dein CMakeLists.txt posten.
Danke für die Antwort, aber ich verwende diese beiden Makros...
Ich bin bereits soweit gegangen diese zu adaptieren, um mir mittels "message" die Pfade (in/out) ausgeben zu lassen - welche korrekt sind imho

Im zip file befindet sich die Ordnerstruktur samt entsprechenden CMakeLists... ich wüsste derzeit nämlich nicht aus welcher ebene ich die CMakeLists.txt posten sollte.
die makros sind in der CMakeLists.txt im Ordner src/libdinjam/data

franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf » 11. September 2010 11:53

Das schaut mir recht unorthodox aus. Das Problem wird sein, dass du über globale Variablen (die ja auch in C++ böse sind...) deine MOCS setzt. Verwenden tust du es in der Verzeichnishierarchie eins tiefer - und da liegt der Hund begraben - die Pfade stimmen nicht mehr!
Bei mir läuft übrigens nichtmal cmake durch:

Code: Alles auswählen

CMake Error in src/libdinjam/CMakeLists.txt:
  Cannot find source file "moc_documenttype.cxx".  Tried extensions .c .C
  .c++ .cc .cpp .cxx .m .M .mm .h .hh .h++ .hm .hpp .hxx .in .txx
Wenn du in libdinjam/data nichts machen willst, dann erledig doch die Arbeit in "data/..". Lass libdinjam/data/CMakeLists.txt weg, und mach dein libdinjam/CMakeLists.txt so:

Code: Alles auswählen

include_directories(${CMAKE_CURRENT_SOURCE_DIR}
                    ${CMAKE_CURRENT_BINARY_DIR}
)

SET(LIBDINJAM_DATA_SRCS
data/global.cpp
)

QT4_WRAP_CPP(LIBDINJAM_DATA_MOCS
data/documenttype.h
)

ADD_LIBRARY(libdinjam ${LIBDINJAM_DATA_SRCS} ${LIBDINJAM_DATA_MOCS})
Dann funktioniert jedenfalls der Teil deines Sourcetrees, den du gepostet hast. (Kompilieren tut es immer noch nicht, liegt aber an den Sourcen - gemoced wird erfolgreich :))

MERKE:
Globale Variablen sind böse, vor allem dann, wenn relative Angaben drin stehen ;)

LordBernhard
Beiträge: 15
Registriert: 3. Februar 2008 16:40

Beitrag von LordBernhard » 11. September 2010 13:51

franzf hat geschrieben:Das schaut mir recht unorthodox aus. Das Problem wird sein, dass du über globale Variablen (die ja auch in C++ böse sind...) deine MOCS setzt. Verwenden tust du es in der Verzeichnishierarchie eins tiefer - und da liegt der Hund begraben - die Pfade stimmen nicht mehr!
Bei mir läuft übrigens nichtmal cmake durch:

Code: Alles auswählen

CMake Error in src/libdinjam/CMakeLists.txt:
  Cannot find source file "moc_documenttype.cxx".  Tried extensions .c .C
  .c++ .cc .cpp .cxx .m .M .mm .h .hh .h++ .hm .hpp .hxx .in .txx
Der Fehler ist mir bekannt, und dadurch ist mir überhaupt erst aufgefallen, dass moc/uic nicht durchlaufen...
franzf hat geschrieben:Wenn du in libdinjam/data nichts machen willst, dann erledig doch die Arbeit in "data/.."
das problem ist jedoch, dass ich noch viele derartige ordner habe, und sonst die cmakelists.txt in der "root" ebene extrem unübersichtlich wird, weshalb ich auch die Lösung mit den globalen variablen versucht habe (wovon ich mir bewusst bin, dass es eine unsaubere/hackish lösung ist)

mhm... danke soweit, dass es so funktionieren würde, aber gibt es keine lösung, dass ich in jedem ordner die jeweiligen sourcefiles hinzufüge? dafür habe ich eben versucht die globalen variablen zu verwenden....
ich hätt einfach gerne eine klare trennung der ordner....

franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf » 11. September 2010 14:33

Es gibt auch in cmake ein "include".
http://cmake.org/cmake/help/cmake-2-8-d ... nd:include
Schreib dir eine CMake List (beliebiger Name) und include den:
data/include.txt

Code: Alles auswählen

QT4_WRAP_CPP(LIBDINJAM_DATA_MOCS
  data/documenttype.h
)

SET(SOURCES ${SOURCES} ${LIBDINJAM_DATA_MOCS} global.cpp)
libdinjam/CMakeLists.txt

Code: Alles auswählen

include_directories(${CMAKE_CURRENT_SOURCE_DIR}
                    ${CMAKE_CURRENT_BINARY_DIR}
)

SET(SOURCES)
include(data/include.txt)

ADD_LIBRARY(libdinjam ${SOURCES})
Aber dein Argument warum nicht direkt im TopLevel-Verzeichnis versteh ich nicht. Was du mit den globalen Variablen an Tänzen hast aufführen müssen, hat keinen Platz gespart.
Und bei ordentlicher Gliederung kann man auch lange CMakeLists.txt übersichtlich halten.
Mit include darfst du halt jetzt statt einem größeren zig kleine Lists verwalten. Mir wäre das zu unübersichtlich ;)

LordBernhard
Beiträge: 15
Registriert: 3. Februar 2008 16:40

Beitrag von LordBernhard » 11. September 2010 16:08

franzf hat geschrieben:Es gibt auch in cmake ein "include".
DANKE! oh mann ich kann nicht glauben, dass ich nicht danach gesucht hab... -.- so ergibt das ganze gleich mal vieeeel mehr sinn....
buildet schon das ganze... :)
franzf hat geschrieben:Aber dein Argument warum nicht direkt im TopLevel-Verzeichnis versteh ich nicht. Was du mit den globalen Variablen an Tänzen hast aufführen müssen, hat keinen Platz gespart.
platz gespart nicht ja... aber dafür waren die ordner recht schön voneinander getrennt
franzf hat geschrieben:Und bei ordentlicher Gliederung kann man auch lange CMakeLists.txt übersichtlich halten.
ist mir bewusst, aber ich hab das lieber aufgeteilt auf mehrere :)
franzf hat geschrieben:Mit include darfst du halt jetzt statt einem größeren zig kleine Lists verwalten. Mir wäre das zu unübersichtlich ;)
jedem das seine ;) mir sind mehrere listen lieber ^^

danke nochmal :)

Antworten