将C预处理器中的变量导入Makefile

时间:2016-09-30 00:30:51

标签: makefile c-preprocessor cross-compiling

我想为Windows和Linux版本创建一个Makefile。问题是我必须为每个平台链接不同的动态库。 C预处理器可能有很少的好变量,例如_WIN32。如何提取这些信息?

解决方案必须与交叉编译器一起使用。我无法创建然后运行一个小程序。我只有一个不同的变量CC,环境可能相同。

另一种方法很简单,-D切换。

类似但不同的问题:

Makefile that distincts between Windows and Unix-like systems
我使用相同的make程序。只有CC变量不同。

2 个答案:

答案 0 :(得分:1)

我不知道你是否可以直接获得这些变量,但你可以尝试这个解决方案:

CPP=i686-w64-mingw32-cpp
CPPFLAGS= -P
WIN32=$(shell echo _WIN32 | $(CPP) $(CPPFLAGS))

iswin32:
    @echo $(WIN32)

此示例将输出1:

$ make iswin32
1

如果您正在处理多个声明,请考虑创建包含所有声明的文件,对其进行预处理并将其包含在makefile中。

$ cat declaration
WIN32 = _WIN32

答案 1 :(得分:0)

根据TTK

的回答

使用变量创建文件,如下所示:

#ifdef _WIN32
-lgdi32 -lopengl32
#else
-lpthread -lX11 -lXxf86vm -lXcursor -lXrandr -lXinerama -lXi -lGL
#endif

类似于Makefile:

A_FLAGS = $(strip $(shell $(CPP) -P $(CPPFLAGS) ./a_flags.cpp))
# or
A_FLAGS = $(strip $(shell $(CPP) -P -xc $(CPPFLAGS) ./a_flags))

$(CPP) - C预处理器可执行文件,应由Make程序定义 -P - 禁止生成线性标记的标志
-xc - 强制预处理器将文件视为C源的标志
$(CPPFLAGS) - 程序员定义的预处理器的可选标志