2017-08-04 52 views
0

我想使用#define语句重定向一些Windows函数,以便轻松编译Linux上的现有代码。 (中的不同功能的功能匹配并不一定是完美的,现在,它只是进行编译。)CMake中的函数(重新)定义

一个例子是:

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

现在我不想在每个函数发生的文件中都做这件事,而且我已经有了一个CMake环境。是否有任何方法可以使用add_definitions()声明或类似的语句在全局范围内为整个项目执行此操作?

+0

https://docs.microsoft.com/en-us/cpp/build/reference/d-preprocessor-definitions和https://stackoverflow.com/questions/14148374/how-do-you-set-properties -in-a-vcproj-file-with-cmake – halfelf

+0

对不起,我打错了。我的意思是编译在Linux上,而不是在Windows上。 –

+0

那么,'-D'也适用于gcc。 – halfelf

回答

1

只需创建一个头文件包含您的重定义,然后用它启动并穿过你的CMake配置的后卫围绕着它:

在你的“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 */ 

然后在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() 

或代替具体的目标,

target_compile_definitions(mytarget PUBLIC REDEF=1) 
+0

对不起,如果我忽略这里显而易见的,但是我必须在每个需要重新定义的文件中包含redefinitions.h吗?因为编辑每个文件是我想避免的。 –

+0

@EXIT_FAILURE您可以添加强制包含以避免手动编辑。但这是大多数使用的基本方法,适用于这两种方法。 – utopia

+0

这正是我想要的。非常感谢。 –

1

感谢乌托邦我能解决我的问题是这样的:

我创建了一个名为一个名为“重新定义”文件夹中的“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() 

[...] 

这可能不是最完美的解决方案,但我的作品和需要最少的努力。