2010-06-02 11 views
7

Qt projemi biraz düzenli tutmak için (Qt Creator kullanarak), bir .pro dosyası ve birden çok .pri dosyası var. Sadece son zamanlarda ben zaten ayrı .pri dosyada varolan bir sınıfla aynı adı taşıyan benim .pri dosyalardan biri için bir sınıf ekledi.Qt MOC Dosya Adı Birden çok .pri dosyası kullanarak çakışmalar

qmake tarafından oluşturulan dosya yapısı ve makefile dosyaları, ortaya çıkan dosya adı çarpışmasından habersiz görünmektedir. oluşturulan moc_ * dosyaları hepsi aynı alt dizine atılan (bağlı bırakın veya hata ayıklama ya) ve bir diğer üzerine yazarak biter.

Makefile.Release:318: warning: overriding commands for target `release/moc_file.cpp` 

Ve proje bağlamak başarısız: Ben projeyi yapmaya çalıştığımda, şuna benzer birkaç uyarı olsun. İşte

ben neden bahsettiğimi basit bir örnektir.

Dizin yapısı: project.pro ait

 
+ project_dir 
| + subdir1 
| | - file.h 
| | - file.cpp 
| + subdir2 
| | - file.h 
| | - file.cpp 
| - main.cpp 
| - project.pro 
| - subdir1.pri 
| - subdir2.pri 

İçindekiler: subdir1.pri ait

TARGET = project 
TEMPLATE = app 
include(subdir1.pri) 
include(subdir2.pri) 
SOURCES += main.cpp 

İçindekiler: subdir2.pri ait

HEADERS += subdir1/file.h 
SOURCES += subdir1/file.cpp 

İçindekiler:

HEADERS += subdir2/file.h 
SOURCES += subdir2/file.cpp 

moc_ * dosyalarını ayrı .pri dosyalarından ayrı alt dizinlere ayıran bir sistem oluşturmak için qmake'ye söyleme yolu var mı?

cevap

3

Yapılacak en iyi şey, tüm dosyaların benzersiz bir ada sahip olduğundan emin olmaktır. Qmake dışında, yaptığınız şeyi yapmaya çalıştığınızda da kırılacak başka araçlar da var; Ayrıca potansiyel olarak kendiniz için kafa karıştırıcı hale (örneğin #include "file.h" ne anlama daha zordur).

+0

İlle karışıklık argümanı kabul etmiyorsanız: #include "subdir1/file.h" Nontheless, doğru görünmektedir. Benzersiz dosya isimleri buraya gitmenin tek yolu gibi görünüyor. – Stephen

+0

Eğer moc dosyaları ve nesne dosyaları benimki takip ettiyseniz şimdi çarpışmayacağına inanıyorum .. Senin yorumunun aksine olsa :) Benimki yanlış ise beni düzeltin .. – liaK

4

subdir1.pri yılında

MOC_DIR = "subdir2/MOCFiles" 

Bu test edilmemiştir vermek subdir2.pri için

MOC_DIR = "subdir1/MOCFiles" 

Ayrıca ekleme deneyin. Sadece kontrol et. Umarım işe yarayacaktır.

Düzenleme 1: MOC dosyalarınızı almak için MOCFiles istediğiniz klasördür.

Düzenleme 2: Özel olarak bu soruyu sorduğundan, MOC dosya dizini ile bahsetmeyi bıraktım. Ancak ek olarak, her bir pri dosyasına aşağıdakileri eklemeniz gerekebilir. Birden pri dosyaları aynı dosya isimleri alarak çarpıştırmadan çalışabilir sahip inanıyoruz

RCC_DIR = "subdir1/RCCFiles" 
UI_DIR = "subdir1/UICFiles" 
OBJECTS_DIR = "subdir1/ObjFiles" 

(klasörler farklı * .pri dosyalar için farklı olduğundan emin olun). Bir cevabı kabul ettiğiniz için (ki bu mümkün değildir), yukarıdaki değişiklikleri yapın ve deneyin. Çalışmıyorsa, bunu bildirin.

+0

Hayır şans. Moc dosyaları şimdi birbiriyle çarpışmaz, ancak nesne (.o) dosyaları vardır. Ne yazık ki. – Stephen

+0

OBJECTS_DIR = "subdir2/ObjFiles" değerini vermeyi deneyin – liaK

0

Bunu daha önce çalıştılar. Kısa cevap, onları bir şekilde farklı şekilde adlandırmaktır.Başka bir cevap, her alt dizini kendi .pro dosyasıyla ayrı bir kitaplık olarak ele almak ve tüm kitaplık dizinlerini derlemek için bir alt anahtar türü kullanmaktır.

Tam bir cevabı gerçekten araştırmak isterseniz, moc için kullanılacak aracı belirtebilirsiniz. Bu durumda, iki farklı dosya için biraz farklı bir ad kullanacak şekilde adı karıştırmanız mümkün olabilir. Ancak, daha sonra her adlandırılmış dosyanın, derlenecek ve linklenecek dosyaların listesine eklendiğinden ve orijinal olarak adlandırılmış moc dosyasının bulunmadığından (veya yapınızın başarısız olmasından) emin olmanız gerekir. benim ifadeleri genellikle formun olacağını belirtmiş

İlgili konular