2017-02-13 9 views
0

Я использовал Cmake для определения folder paths.Ошибка C++: ожидаемое первичное выражение перед ';' токеном с использованием Cmake

У меня есть Config.in.h файл и где #cmakedefine объявлены как

#cmakedefine CAFFE_MODEL_PATH 
#cmakedefine CAFFE_MODEL_PATH 
#cmakedefine CAFFE_TRAIN_MODEL 
#cmakedefine MEAN_FILE 
#cmakedefine LABEL_FILE 

В моей CMakeLists.txt, я сделал, как

set(CAFFE_MODEL_PATH "" CACHE PATH "Path to a Caffe model") 
set(CAFFE_TRAIN_MODEL "" CACHE PATH "Path to a trained model") 
set(MEAN_FILE "" CACHE PATH "Path to the mean file all trained images") 
set(LABEL_FILE "" CACHE PATH "Path to the mean file all trained images") 
configure_file (
    "${PROJECT_SOURCE_DIR}/Config.h.in" 
    "${PROJECT_SOURCE_DIR}/Config.h" 
) 

Так что Config.h имеет #define для тех CAFFE_MODEL_PATH, CAFFE_TRAIN_MODEL, MEAN_FILE, LABEL_FILE.

Но когда я использую их в моем файле main.cpp

int main(void) { 

    ::google::InitGoogleLogging("endtoenddetection"); 

    string model_file = CAFFE_MODEL_PATH; 
    string trained_file = CAFFE_TRAIN_MODEL; 
    string mean_file = MEAN_FILE; 
    string label_file = LABEL_FILE; 
} 

У меня есть ошибки, как

/home/Softwares/ReInspect/endtoendLstm/main.cpp:8:43: error: expected primary-expression before ‘;’ token 
    string model_file = CAFFE_MODEL_PATH; 
             ^
/home/Softwares/ReInspect/endtoendLstm/main.cpp:9:44: error: expected primary-expression before ‘;’ token 
    string trained_file = CAFFE_TRAIN_MODEL; 
              ^
/home/Softwares/ReInspect/endtoendLstm/main.cpp:10:36: error: expected primary-expression before ‘;’ token 
    string mean_file = MEAN_FILE; 
            ^
/home/Softwares/ReInspect/endtoendLstm/main.cpp:11:37: error: expected primary-expression before ‘;’ token 
    string label_file = LABEL_FILE; 
+1

У вас есть '#include" Config.h "' в 'main.cpp'? – Barmar

+0

'Так что у Config.h есть #define для них' - я думаю, у него есть'/* #undef VAR */'для всех ваших макросов (то есть ** вообще не определяет их **). Это связано с тем, что содержимое соответствующих переменных в CMake равно * empty *, которое оценивается CMake как * false *. См. [Документация] (https://cmake.org/cmake/help/v3.7/command/configure_file.html) для команды 'configure_file'. Если вы хотите определить макрос с (возможно, пустым) строковым значением, используйте '#define CAFFE_MODEL_PATH" @ CAFFE_MODEL_PATH @ "' в вашем файле 'Config.h.in'. – Tsyvarev

+0

Да, я включаю «Config.h» в main.cpp – batuman

ответ

1

Когда configure_file выражение

#cmakedefine CAFFE_MODEL_PATH 

фактически условный макрос определение. То есть макрос определяется только тогда, когда соответствующая переменная CMake оценивается как no-false (в соответствии с правилами if(constant)).

В вашем случае переменные CMake имеют пусто значения, которые оцениваются как ложные. Так сконфигурированный файл (Config.h в вашем случае) не содержит определений макросов.

Если вы хотите определить макрос строковое значение используйте

#define CAFFE_MODEL_PATH "@[email protected]" 

таким образом макрос будет правильно определена, даже если соответствует переменная пуста.

См. Также documentation для команды configure_file.

Смежные вопросы