本文主要是介绍Makefile问答之02 预处理器与宏,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
GCC Makefile中,怎样设定预处理器名称
在 GCC 的 Makefile 中,预处理器(preprocessor)的名称通常是 cpp(C PreProcessor),但在实际的 Makefile 中,我们一般是通过 gcc 命令来调用预处理器,而不是直接调用 cpp。不过,你可以通过设置 CPP 变量来显式指定预处理器名称和选项。以下是如何在 Makefile 中进行设置和使用的示例。
示例 Makefile
# 编译器
CC = gcc
# 预处理器
CPP = cpp
# 编译选项
CFLAGS = -Wall -O2 -Iinclude
# 链接选项
LDFLAGS =
# 需要链接的库
LDLIBS =
# 目标文件
TARGET = my_program
# 查找所有源文件
SRCS = $(shell find src -name '*.c')
# 自动生成对应的目标文件名
OBJS = $(SRCS:.c=.o)
# 默认目标
all: $(TARGET)
# 链接
$(TARGET): $(OBJS)
$(CC) -o $@ $(OBJS) $(LDFLAGS) $(LDLIBS)
# 编译
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
# 预处理
%.i: %.c
$(CPP) -E $< -o $@
# 清理
clean:
rm -f $(TARGET) $(OBJS)
说明
- 设定预处理器名称:
CPP = cpp
这里设置了 CPP 变量,指定了预处理器的名称。在实际使用中,cpp 是 GNU 编译器集合的 C 预处理器。你可以将其替换为其他预处理器的名称(如果有的话),但通常情况下使用默认的 cpp 就足够了。- 预处理规则:
%.i: %.c - $(CPP) -E $< -o $@
这个规则用于从 .c 文件生成 .i 文件,即预处理后的文件。$< 是源文件,$@ 是目标文件。-E 选项告诉 cpp 只进行预处理,不进行编译。- 编译规则:
%.o: %.c - $(CC) $(CFLAGS) -c $< -o $@
这个规则用于从 .c 文件编译生成 .o 文件。$< 是源文件,$@ 是目标文件。-c 选项告诉 gcc 只进行编译,不进行链接。
使用说明
- 运行预处理:可以使用 make 命令来执行预处理和编译,或使用类似 make file.i 的命令来仅进行预处理。
- 运行编译:执行 make 将编译所有 .c 文件并生成 .o 文件,最后链接成可执行文件。
通过这种方式,你可以灵活地设置和使用预处理器,同时保留了编译和链接的完整控制。
网络搜索
复制
CMakefile怎样定义全局可见宏
在 CMake 中定义全局可见宏可以通过设置 CMake 的编译选项来实现,这样所有的源文件在编译时都会使用这些宏定义。你可以使用 add_definitions() 或 target_compile_definitions() 来定义全局宏。
方法 1: 使用 add_definitions()
add_definitions() 用于向编译器添加全局编译选项,包括宏定义。这些宏定义会应用到所有的目标。
cmake_minimum_required(VERSION 3.10)
project(MyProject)
# 定义全局宏
add_definitions(-DMY_GLOBAL_MACRO=1 -DANOTHER_MACRO)
# 添加源文件
add_executable(my_executable main.cpp another_source.cpp)
在这个例子中,-DMY_GLOBAL_MACRO=1 和 -DANOTHER_MACRO 是两个全局宏定义,它们会被应用到所有的编译目标中。
方法 2: 使用 target_compile_definitions()
如果你希望宏定义仅对特定的目标有效,或者希望宏定义能够分组管理,target_compile_definitions() 是一个更好的选择。
cmake_minimum_required(VERSION 3.10)
project(MyProject)
# 添加源文件
add_executable(my_executable main.cpp another_source.cpp)
# 为特定目标定义宏
target_compile_definitions(my_executable PRIVATE MY_GLOBAL_MACRO=1 ANOTHER_MACRO)
在这个例子中,MY_GLOBAL_MACRO=1 和 ANOTHER_MACRO 只会在 my_executable 目标的编译中可见。PRIVATE 关键字表示这些宏定义只在该目标的编译中有效,而 PUBLIC 和 INTERFACE 可以用于不同的上下文。
方法 3: 使用 CMAKE_CXX_FLAGS 或 CMAKE_C_FLAGS
你也可以直接设置 CMake 变量来定义编译器标志,这将影响所有的编译目标。
cmake_minimum_required(VERSION 3.10)
project(MyProject)
# 定义全局宏
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DMY_GLOBAL_MACRO=1 -DANOTHER_MACRO")
# 添加源文件
add_executable(my_executable main.cpp another_source.cpp)
总结
- add_definitions():适用于需要全局应用的宏定义,但不推荐用于更复杂的目标设置。
- target_compile_definitions():适用于目标特定的宏定义,推荐用于现代 CMake 项目。
- CMAKE_CXX_FLAGS:用于全局编译选项设置,但可能不如 target_compile_definitions() 灵活。
选择哪种方法取决于你的具体需求和项目结构。
这篇关于Makefile问答之02 预处理器与宏的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!