CMake中的函数(重新)定义

时间:2017-08-04 08:26:56

标签: c++ cmake

我想使用#define语句重定向许多Windows函数,以便在Linux上轻松编译现有代码。 (不同功能的功能匹配现在不一定非常完美,只需要编译。)

一个例子是:

#define sprintf_s(a, b, c, d) snprintf(a, b, c, d)

现在我不想在功能发生的每个文件中执行此操作,并且我已经拥有了CMake环境。有没有办法在整个项目中使用add_definitions()语句或类似的东西来全局执行此操作?

2 个答案:

答案 0 :(得分:1)

Just create a header file containing your redefinitions, then surround it with a guard which is enabled and passed through by your CMake configuration:

In your "redefinitions.h":

#ifndef REDEFINITIONS_H
#define REDEFINITIONS_H

#ifdef REDEF
#define sprintf_s(a, b, c, d) snprintf(a, b, c, d)
/* #define ... */
/* #define ... */
/* #define ... */
#endif

#endif /* REDEFINITIONS_H */

Then in your CMakeLists.txt:

# Optional CMake Option
# Use with: cmake -DREDEFINITIONS=OFF
option(REDEFINITIONS "Cross-platform symbol redefinitions" ON)
if(REDEFINITIONS)
    add_definitions(-DREDEF)
endif()

# Or optional platform detection
if(UNIX AND NOT APPLE) 
    add_definitions(-DREDEF)
endif()

or for specific targets instead,

target_compile_definitions(mytarget PUBLIC REDEF=1)

答案 1 :(得分:1)

感谢乌托邦,我能够像这样解决我的问题:

我在一个名为“redefinitions”的文件夹中创建了一个名为“redefinitions.h”的新文件,该文件只包含所需的函数重定义,例如:

redefinitions.h:

#define sprintf_s(a, b, c, d) snprintf(a, b, c, d)
[...]

然后我将以下行添加到我的CMake文件中:

CMakeLists:

[...]

option(REDEFINITIONS "Cross-platform symbol redefinitions" ON)
if(REDEFINITIONS)
    include_directories(redefinitions)
    add_compile_options(-include redefinitions.h)
endif()

[...]

这可能不是最优雅的解决方案,但我工作并且只需要很少的努力。