转义COMPILE_DEFINITIONS的引号

时间:2014-02-10 19:39:28

标签: visual-studio-2010 cmake

目前我正在编写一个cmake脚本来编译生成的C代码。我正在尝试生成一个Visual Studio 10项目。该代码包含几个#include语句,必须在编译之前进行预处理:

#indude INC_FILE

在开始使用CMake之前,代码是使用手动维护的Visual Studio项目编译的。我添加了一个预处理器定义,用最终的include头替换INC_FILE:

INC_FILE="foo.h"

对于我的新CMak脚本,我尝试将此语句添加到COMPILE_DEFINITION变量中:

set_property(TARGET ${TARGET_NAME} APPEND_STRING PROPERTY COMPILE_DEFINITION "INC_FILE="foo.h"")

可悲的是,这不起作用,因为删除了引号。在生成的visual studio项目中,我在项目文件中找到了:

INC_FILE=foo.h

我试图逃避引号:

  • “INC_FILE = \” foo.h中\ “”
  • INC_FILE = \ “foo.h中\”
  • “INC_FILE = \\” foo.h中\\“
  • “INC_FILE =” foo.h中“

以上所有提到的可能性都不起作用。在cmake中是否有任何其他技巧可以为我的预处理器定义获取正确的引号?

1 个答案:

答案 0 :(得分:1)

使用cmake 2.8.12.1进行测试:

add_executable(foo foo.cpp)
target_compile_definitions(foo PUBLIC FOO_INCL="foo.hpp")

注1

您可以使用include选项代替文件名宏:

#if defined(FOO_INCLUDE_SOME_FILE)
# include "some_file.hpp"
#elif defined(FOO_INCLUDE_OTHER_FILE)
# include "other_file.hpp"
#endif

恕我直言,它看起来更干净。

注2

如果您使用特殊字符的时间不好,请使用configure_file命令:

> cat some_file.hpp.in
#include "@FOO_INCLUDE_FILE@"
> cat CMakeLists.txt
set(FOO_INCLUDE_FILE "other_file.hpp")
configure_file(some_file.hpp.in ${foo_BINARY_DIR}/include/some_file.hpp @ONLY)