C++错误:";"之前应为主表达式使用Cmake的令牌

C++ error: expected primary-expression before ‘;’ token using Cmake

本文关键字:quot 表达式 Cmake 令牌 错误 C++      更新时间:2023-10-16

我使用Cmake来定义folder paths

我有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具有针对那些CAFFE_MODEL_PATH, CAFFE_TRAIN_MODEL, MEAN_FILE, LABEL_FILE的#define。

但是当我在我的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;

configure_file时,表达式

#cmakedefine CAFFE_MODEL_PATH

实际上是一个条件宏定义。也就是说,只有当对应的CMake变量被评估为no false时,才定义宏(根据if(常量)规则)。

在您的情况下,CMake变量具有值,这些值被评估为false。因此配置的文件(在您的情况下为Config.h)不包含宏定义

如果要用字符串值定义宏,请使用

#define CAFFE_MODEL_PATH "@CAFFE_MODEL_PATH@"

这样,即使对应的变量为空,也可以正确定义宏。

另请参阅configure_file命令的文档。