Skip to content

String.h conflicts with <string.h> on case insensitive filesystems #37

@WestfW

Description

@WestfW

The Arduino API renamed "WString.h" to "String.h"
Given that "string.h" is a part of libc, and that most modern operating systems implement sort of "fuzzy" case-matching in their filesystems, this seems ripe for generating confusion.

And in fact, it seems to break builds when sketches have been imported into Atmel Studio 7, if they use the ArduinoAPI - when ipaddress.cpp is built as part of the core, it includes both <string.h> and "String.h", and gets api/string.h for both of them, leaving the libc functions undefined:

Target "CoreBuild" in file "C:\Program Files (x86)\Atmel\Studio\7.0\Vs\Compiler.targets" from project "c:\users\rnovaes\Documents\Atmel Studio\7.0\ArduinoSketch7\ArduinoSketch7\ArduinoCore\ArduinoCore.cppproj" (target "Build" depends on it):
	Using "RunCompilerTask" task from assembly "C:\Program Files (x86)\Atmel\Studio\7.0\Extensions\Application\AvrGCC.dll".
	Task "RunCompilerTask"
		Shell Utils Path C:\Program Files (x86)\Atmel\Studio\7.0\shellUtils
		C:\Program Files (x86)\Atmel\Studio\7.0\shellUtils\make.exe all --jobs 4 --output-sync 
		Building file: ../src/core/api/IPAddress.cpp
		Invoking: AVR8/GNU C Compiler : 5.4.0
		"C:\Program Files (x86)\Atmel\Studio\7.0\toolchain\avr8\avr8-gnu-toolchain\bin\avr-g++.exe" -funsigned-char -funsigned-bitfields -DDEBUG -DF_CPU=16000000L -DARDUINO=10809 -DARDUINO_AVR_NANO_EVERY -DARDUINO_ARCH_AVR -DUSB_VID=0x2341 -DUSB_PID=0x0058 -DUSB_MANUFACTURER="\"Arduino LLC\""  -I"C:\Program Files (x86)\Atmel\Studio\7.0\Packs\atmel\ATmega_DFP\1.2.209\include" -I"..\include\core" -I"..\include\core\api" -I"..\include\core\api\deprecated" -I"..\include\core\api\deprecated-avr-comp\avr" -I"..\include\variants\nona4809"  -Os -fno-threadsafe-statics -ffunction-sections -fdata-sections -fpack-struct -fshort-enums -g2 -w -mmcu=atmega4809 -B "C:\Program Files (x86)\Atmel\Studio\7.0\Packs\atmel\ATmega_DFP\1.2.209\gcc\dev\atmega4809" -c -std=gnu++11 -MD -MP -MF "src/core/api/IPAddress.d" -MT"src/core/api/IPAddress.d" -MT"src/core/api/IPAddress.o"   -o "src/core/api/IPAddress.o" "../src/core/api/IPAddress.cpp" 
		In file included from ../src/core/api/IPAddress.cpp:21:0:
		..\include\core\api/Print.h: In member function 'size_t Print::write(const char*)':
c:\users\rnovaes\Documents\Atmel Studio\7.0\ArduinoSketch7\ArduinoSketch7\ArduinoCore\include\core\api\Print.h(50,52): error: 'strlen' was not declared in this scope
		       return write((const uint8_t *)str, strlen(str));
		                                                    ^
		../src/core/api/IPAddress.cpp: In constructor 'IPAddress::IPAddress(const uint8_t*)':
c:\users\rnovaes\Documents\Atmel Studio\7.0\ArduinoSketch7\ArduinoSketch7\ArduinoCore\src\core\api\IPAddress.cpp(43,59): error: 'memcpy' was not declared in this scope
		     memcpy(_address.bytes, address, sizeof(_address.bytes));
		                                                           ^
		../src/core/api/IPAddress.cpp: In member function 'IPAddress& IPAddress::operator=(const uint8_t*)':
c:\users\rnovaes\Documents\Atmel Studio\7.0\ArduinoSketch7\ArduinoSketch7\ArduinoCore\src\core\api\IPAddress.cpp(90,59): error: 'memcpy' was not declared in this scope
		     memcpy(_address.bytes, address, sizeof(_address.bytes));
		                                                           ^
		../src/core/api/IPAddress.cpp: In member function 'bool IPAddress::operator==(const uint8_t*) const':
c:\users\rnovaes\Documents\Atmel Studio\7.0\ArduinoSketch7\ArduinoSketch7\ArduinoCore\src\core\api\IPAddress.cpp(102,63): error: 'memcmp' was not declared in this scope
		     return memcmp(addr, _address.bytes, sizeof(_address.bytes)) == 0;
		                                                               ^
		make: *** [src/core/api/IPAddress.o] Error 1
c:\users\rnovaes\Documents\Atmel Studio\7.0\ArduinoSketch7\ArduinoSketch7\ArduinoCore\Debug\Makefile(243,1): error: recipe for target 'src/core/api/IPAddress.o' failed

There is some discussion here: https://www.avrfreaks.net/forum/7-compilation-error-arduino-nano-every-sketch
The exact problem may be that AS7 adds -I"..\include\core\api" that isn't needed (or used in an Arduino IDE build), but it does illustrate the sort of confusion that can/will occur.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions