【发布时间】:2019-09-02 15:24:52
【问题描述】:
我正在为我的 ESP32 使用示例项目,我已将主 C 文件拆分为两个文件,main.c 和 wifi.c,其中一个包含共享变量的头文件。
头文件:
#ifndef WIFI_TEST_H
#define WIFI_TEST_H
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/event_groups.h"
#include "esp_system.h"
#include "esp_log.h"
#include "esp_ota_ops.h"
#include "esp_http_client.h"
#include "esp_flash_partitions.h"
#include "esp_partition.h"
#include "esp_wifi.h"
#include "esp_event_loop.h"
#define EXAMPLE_WIFI_SSID CONFIG_WIFI_SSID
#define EXAMPLE_WIFI_PASS CONFIG_WIFI_PASSWORD
const char *TAG = "wifi_test";
/* FreeRTOS event group to signal when we are connected & ready to make a request */
EventGroupHandle_t wifi_event_group;
/* The event group allows multiple bits for each event,
but we only care about one event - are we connected
to the AP with an IP? */
const int CONNECTED_BIT = BIT0;
esp_err_t event_handler(void *, system_event_t *);
void initialise_wifi(void);
#endif
此文件包含在main.c 和wifi.c 中。
编译时,我收到以下错误:
/project/build/main/libmain.a(wifi.o):(.data.TAG+0x0): multiple definition of `TAG'
/project/build/main/libmain.a(main.o):(.data.TAG+0x0): first defined here
/project/build/main/libmain.a(wifi.o):(.rodata.CONNECTED_BIT+0x0): multiple definition of `CONNECTED_BIT'
/project/build/main/libmain.a(main.o):(.rodata.CONNECTED_BIT+0x0): first defined here
变量只在 h 文件中声明。我认为这可能是由于包括警卫,但它也不起作用。
我做了一个make clean 以确保没有留下任何旧的东西,仍然没有运气。
也许我只是忽略了一些微不足道的事情......
【问题讨论】:
-
您在头文件中定义变量,这意味着它将在包含该头文件的所有translation units 中定义。而是在头文件中声明变量(使用
extern关键字并且不进行初始化),然后在单个源中定义(并初始化)变量。 -
啊,解决了!我认为由于包含警卫,它只会被定义一次,但猜不是=)谢谢!
-
包含保护用于在一个编译单元中重复包含。一个 cpp 的编译应该如何知道其他 cpp 中包含的内容?
-
@Someprogrammerdude 您似乎已经完全回答了这个问题。你会回答这个问题吗?