2014-02-14 47 views
2

我想知道是否有某種方法可以在運行時讀取QT項目的.pro文件中定義的變量。問題在於Im試圖編譯cuda,只有一個體繫結構(Sm_21),我想決定運行時使用具有該功能的cuda設備。在程序中讀取QT .pro文件

.pro文件:

QT  += core gui opengl 

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets 

TARGET = hello-opengl 
TEMPLATE = app 


SOURCES += main.cpp\ 
     mainwindow.cpp \ 
     glwidget.cpp \ 



HEADERS += mainwindow.h \ 
      glwidget.h \ 



FORMS += mainwindow.ui 


CUDA_ARCH = sm_21   # Type of CUDA architecture 

我想一些辦法在我的.cpp使用這個CUDA_ARCH變量。例如

if (CUDA_ARCH == sm_21) 
    then pick device 0 
else 
    pick device 1 

非常感謝!

+0

爲最後一項措施,您可以隨時打開.pro文件並使用QFile解析/替換CUDA_ARCH值,例如 – Shf

回答

3

你可以用增值preprosessor宏,在的.pro做:

CUDA_ARCH = sm_21   # Type of CUDA architecture 

DEFINES += CUDA_ARCH=$${CUDA_ARCH} 

所以這基本上等同於在代碼喲

#define CUDA_ARCH sm_21 

然後:添加以下內容到你的C代碼ü可以只使用宏,就像你使用任何的#define,例如:

// enum is most convenient way to get the architectures as symbols 
enum CudaArchEnum { sm_21, sm_22}; 

//... initialize a variable 
enum CudaArchEnum value = CUDA_ARCH; // value = sm_21; 

//.. or from your question 
if (CUDA_ARCH == sm_21) { 
    // pick device 0 
} else { 
    // pick device 1 
} 

你也可以把它給一個變量爲字符串,像這樣:

const char *CudaArchStr = #CUDA_ARCH; // CudaArchStr = "sm_21" 
+0

謝謝!做到了!雖然我不得不添加一些反斜槓,以便定義將是一個字符串。否則,我得到一個編譯錯誤,說sm_21沒有在該範圍內聲明。 CUDA_ARCH = \\\「$$ {CUDA_ARCH} \\\」 – gumlym

6

您可以使用

DEFINES += CUDA_ARCH_SM_21 

,並要求在代碼

#ifdef CUDA_ARCH_SM_21 

我不認爲它可以直接創建.pro文件「全局」變量。但是,你可以只設定你的全局變量CUDA_ARCH中的#ifdef塊

#define CA_SM_21 0 
#define CA_SM_OTHER 1 
#ifdef CUDA_ARCH_SM_21 
    int CUDA_ARCH = CA_SM_21 
#elseif 
    int CUDA_ARCH = CA_SM_OTHER 
#endif 

if(CUDA_ARCH == CA_SM_21)...