Я выполняю кросс-компиляцию в 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 };
Код: Выделить всё
[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_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
Мобильная версия