Это происходит потому, что вы помещаете определения в заголовочный файл. Каждая единица перевода , в которую включен заголовок, создает отдельное определение для компоновщика, что приводит к ошибке определения дубликата.
Определения принадлежат файлу реализации. Только объявления должны идти в заголовок; Реализации должны идти в отдельный файл:
inventory.h
extern const char *jpeg_perf_inputs[];
extern const char *zip_large_input [];
extern size_t num_jpeg_perf_inputs;
extern size_t num_zip_large_inputs;
inventory.c
#include"inventory.h"
const char *jpeg_perf_inputs[] = {
"perf_11k_img_jpg",
"Sample_jpg_image_1mb_jpg"};
const char *zip_large_input [] = {
"a.zip",
"b.zip"
};
size_t num_jpeg_perf_inputs = sizeof(jpeg_perf_inputs) / sizeof(jpeg_perf_inputs[0]);
size_t num_zip_large_inputs = sizeof(zip_large_input) / sizeof(zip_large_input[0]);
Заголовка достаточно для компиляции зависимостей, в то время как реализация создает один экземпляр определения для каждого объекта.
Обратите внимание на использование size_t
вместо int32_t
.