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)

说明

  1. 设定预处理器名称
    CPP = cpp




  2. 这里设置了 CPP 变量,指定了预处理器的名称。在实际使用中,cpp 是 GNU 编译器集合的 C 预处理器。你可以将其替换为其他预处理器的名称(如果有的话),但通常情况下使用默认的 cpp 就足够了。
  3. 预处理规则
    %.i: %.c
  4.     $(CPP) -E $< -o $@




  5. 这个规则用于从 .c 文件生成 .i 文件,即预处理后的文件。$< 是源文件,$@ 是目标文件。-E 选项告诉 cpp 只进行预处理,不进行编译。
  6. 编译规则
    %.o: %.c
  7.     $(CC) $(CFLAGS) -c $< -o $@




  8. 这个规则用于从 .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() 灵活。

选择哪种方法取决于你的具体需求和项目结构。

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值