Компоновщик жалуется на несколько определенийLinux

Ответить
Anonymous
 Компоновщик жалуется на несколько определений

Сообщение Anonymous »

Я слишком долго смотрел на это и, возможно, просто не заметил чего-то очевидного.
Я выполняю кросс-компиляцию в Ubuntu 24.04, используя /usr/bin/aarch64-linux-gnu -g++-12 кросс-компилятор для Raspberry Pi Zero2 W. У меня все работало нормально. Я хотел создать карту, содержащую только некоторые значения задержки для устройства, к которому я обращаюсь. Во включаемом файле у меня есть:

Код: Выделить всё

    154 typedef enum {
155   SHT4X_TIMING_SOFT_RESET,
156   SHT4X_TIMING_MEASUREMENT_LOW_REPEATABILITY,
157   SHT4X_TIMING_MEASUREMENT_MED_REPEATABILITY,
158   SHT4X_TIMING_MEASUREMENT_HIGH_REPEATABILITY,
159   SHT4X_TIMING_HEATER_DURATION_LONG,
160   SHT4X_TIMING_HEATER_DURATION_SHORT,
161 } Sht4xMaxTimings;
162
163 /*
164  * These are in microseonds
165  */
166 map sht4x_min_delays = {
167     {SHT4X_TIMING_SOFT_RESET,1000}, /* tpu 1 millisecond */
168     /*
169      * For the next 3 the table says including tpu. I take that
170      * to mean I should add the value above, tpu, to these values
171      * in the table. I may have that wrong though.
172      */
173     {SHT4X_TIMING_MEASUREMENT_LOW_REPEATABILITY, 1600 + 1000}, /* 1.6 millisecond  + tpu = 2.6 milliseconds*/
174     {SHT4X_TIMING_MEASUREMENT_MED_REPEATABILITY, 500 + 1000}, /* 4.5 milliseconds + tpu = 5.5 milliseconds */
175     {SHT4X_TIMING_MEASUREMENT_HIGH_REPEATABILITY, 8300 + 1000}, /* 8.3 milliseconds + tpu = 9.3 milliseconds */
176     {SHT4X_TIMING_HEATER_DURATION_LONG, 1100000},     /* 1.1 seconds */
177     {SHT4X_TIMING_HEATER_DURATION_SHORT, 110000}   /* 0.11 seconds */
178 };
Эти значения просто передаются в usleep() в зависимости от вызванной команды. Прямо сейчас я закомментировал все командные строки usleep(), чтобы убедиться, что единственный шанс, что переменная с этим именем, которую увидит компилятор, определена в строке 166. При компиляции я получаю следующую ошибку:

Код: Выделить всё

[main] Building folder: /home/chrisk/Projects/RaspberryPi/WS/build
[build] Starting build
[proc] Executing command: /usr/bin/cmake --build /home/chrisk/Projects/RaspberryPi/WS/build --config Debug --target all --
[build] [2/4  25% :: 0.757] Building CXX object src/CMakeFiles/WeatherStation.dir/main.cpp.o
[build] [2/4  50% :: 0.878] Building CXX object src/lib/devices/i2c/CMakeFiles/i2cdevices.dir/sht4x.cpp.o
[build] [3/4  75% :: 0.931] Linking CXX static library src/lib/devices/i2c/libi2cdevices.a
[build] [4/4 100% :: 1.044] Linking CXX executable src/WeatherStation
[build] FAILED: src/WeatherStation
[build] : && /usr/bin/aarch64-linux-gnu-g++-12 --sysroot=/opt/sdk/rpi_zero_2_w -g  src/CMakeFiles/WeatherStation.dir/main.cpp.o -o src/WeatherStation  src/lib/devices/i2c/libi2cdevices.a  src/lib/units/libunits.a && :
[build] /usr/lib/gcc-cross/aarch64-linux-gnu/12/../../../../aarch64-linux-gnu/bin/ld: src/lib/devices/i2c/libi2cdevices.a(sht4x.cpp.o):/home/chrisk/Projects/RaspberryPi/WS/src/lib/devices/i2c/include/sht4x.h:166: multiple definition of `sht4x_min_delays'; src/CMakeFiles/WeatherStation.dir/main.cpp.o:/home/chrisk/Projects/RaspberryPi/WS/src/lib/devices/i2c/include/sht4x.h:166: first defined here
[build] collect2: error: ld returned 1 exit status
[build] ninja: build stopped: subcommand failed.
[proc] The command: /usr/bin/cmake --build /home/chrisk/Projects/RaspberryPi/WS/build --config Debug --target all -- exited with code: 1
[driver] Build completed: 00:00:01.069
[build] Build finished with exit code 1
Итак, компоновщик считает, что sht4x_min_delay был определен несколько раз. Это показывает, что впервые оно было определено в строке 166 выше. Он не удосужился сказать мне, где еще оно было определено.
Я попытался изменить имя переменной sht4x_min_delays, а затем он говорит, что это имя имеет несколько определений. Я просмотрел все файлы проекта, и это единственное место, где можно найти sht4x_min_delays, кроме тех, которые я закомментировал.
Я сделал make clean, а затем пересобрал и все равно получаю ту же ошибку. Файл sht4x.h имеет соответствующую защиту, предотвращающую его повторное включение:
'''

Код: Выделить всё

#ifndef SRC_LIB_DEVICES_I2C_INCLUDE_SHT4X_H_
#define SRC_LIB_DEVICES_I2C_INCLUDE_SHT4X_H_

#endif
'''
Итак, я не понимаю, почему компоновщик считает, что существует несколько определений.
Любые идеи будут полезны

Подробнее здесь: https://stackoverflow.com/questions/791 ... efinitions
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Linux»