我想使用#define语句重定向许多Windows函数,以便在Linux上轻松编译现有代码。 (不同功能的功能匹配现在不一定非常完美,只需要编译。)
一个例子是:
#define sprintf_s(a, b, c, d) snprintf(a, b, c, d)
现在我不想在功能发生的每个文件中执行此操作,并且我已经拥有了CMake环境。有没有办法在整个项目中使用add_definitions()
语句或类似的东西来全局执行此操作?
答案 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()
[...]
这可能不是最优雅的解决方案,但我工作并且只需要很少的努力。