【问题标题】:How to read a CMake Variable in C++ source code如何在 C++ 源代码中读取 CMake 变量
【发布时间】:2011-12-15 14:02:59
【问题描述】:

我想将我的库的版本号存储在一个地方。所以我在 CMake 文件中定义了这样一个变量:

    SET(LIBINTERFACE_VERSION 1 CACHE INTEGER "Version of libInterface")

有了这个定义,我可以根据微软的定义生成一个 version.rc 文件,我将它编译到库中,然后在我的 dll 文件的属性窗口中正确显示。

现在我也想在我的 c++ 源代码中使用这个 CMake 变量,但实际上我没有找到可行的解决方案。我尝试过类似这样的不同方法:

    #ifndef VERSION_LIBINTERFACE
    #  define VERSION_LIBINTERFACE @LIBINTERFACE_VERSION@
    #endif

或者这个:

    unsigned int getLibInterfaceVersion()
    {
        return @LIBINTERFACE_VERSION@;
    }

但是编译器不会接受任何东西。由于我在 CMake-Documentation 中的研究没有得到任何结果,希望有人能给我一些重要的建议。

提前致谢。

【问题讨论】:

  • 您需要将此变量值作为预编译器常量传递给编译器。确切的语法取决于使用的编译器。
  • 我正在使用 Visual Studio 2010 编译器。所以我可以像msdn.microsoft.com/en-us/library/b0084kay(v=vs.80).aspx 中列出的常量一样使用它?可以举个例子吗?

标签: c++ makefile cmake header-files


【解决方案1】:

执行此操作的最简单方法是将 LIBINTERFACE_VERSION 作为带有add_definition 的定义传递:

add_definitions( -DVERSION_LIBINTERFACE=${LIBINTERFACE_VERSION} )

不过,您也可以创建“头文件模板”并使用configure_file。这样,CMake 将替换您的@LIBINTERFACE_VERSION@。这也更具可扩展性,因为您可以在此处轻松添加额外的定义或变量...

例如创建一个文件“version_config.h.in”,如下所示:

#ifndef VERSION_CONFIG_H
#define VERSION_CONFIG_H

// define your version_libinterface
#define VERSION_LIBINTERFACE @LIBINTERFACE_VERSION@

// alternatively you could add your global method getLibInterfaceVersion here
unsigned int getLibInterfaceVersion()
{
    return @LIBINTERFACE_VERSION@;
}

#endif // VERSION_CONFIG_H

然后在你的 cmakelists.txt 中添加一个 configure_file 行:

configure_file( version_config.h.in ${CMAKE_BINARY_DIR}/generated/version_config.h )
include_directories( ${CMAKE_BINARY_DIR}/generated/ ) # Make sure it can be included...

当然,请确保您的源文件中包含正确的 version_config.h。

【讨论】:

  • 非常感谢。这就是我一直在寻找的。​​span>
  • add_definitions 可能更容易
  • @frankliuao。同意,这就是为什么这是我回答的第一句话。
猜你喜欢
  • 1970-01-01
  • 2021-01-03
  • 1970-01-01
  • 1970-01-01
  • 2021-01-29
  • 1970-01-01
  • 2014-08-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多