从 C 预处理器导入变量到 Makefile

Import variables from C preprocessor into Makefile

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

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

反过来也很简单,-D 开关。


类似但不同的问题:

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

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

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

基于 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) – 程序员定义的预处理器的可选标志