I'm have problem compiling a code.
ardutest.ino:
#include "mylib.h"
#include <SD.h>
void setup() {
}
void loop() {
fn();
}
mylib.h:
#ifndef mylib_h
#define mylib_h
#include "Arduino.h"
void fn(File &_file);
#endif
mylib.c:
#include "mylib.h"
void fn(File &_file)
{
_file = SD.open("LOG.TXT", FILE_WRITE);
_file.println(42);
_file.close();
}
When checking code in Arduino IDE I have this error:
In file included from sketch/mylib.c:1:0:
mylib.h:7: error: expected ')' before '&' token
void fn(File &_file);
^
mylib.c:3: error: expected ')' before '&' token
void fn(File &_file)
^
Multiple libraries were found for "SD.h"
Used: /home/mario/Arduino/libraries/SD
Not used: /home/mario/Programs/arduino/libraries/SD
exit status 1
expected ')' before '&' token
But if I put SD.h in mylib.h (other files are the same):
#ifndef mylib_h
#define mylib_h
#include "Arduino.h"
#include <SD.h>
void fn(File &_file);
#endif
I have this error:
In file included from /home/user/Arduino/libraries/SD/src/utility/Sd2Card.h:26:0,
from /home/user/Arduino/libraries/SD/src/utility/SdFat.h:29,
from /home/user/Arduino/libraries/SD/src/SD.h:20,
from sketch/mylib.h:5,
from sketch/mylib.c:1:
/home/user/Arduino/libraries/SD/src/utility/Sd2PinMap.h:423:14: error: unknown type name 'pin_map_t'
static const pin_map_t digitalPinMap[] = {
^
/home/user/Arduino/libraries/SD/src/utility/Sd2PinMap.h:447:69: error: 'pin_map_t' undeclared here (not in a function)
static const uint8_t digitalPinCount = sizeof(digitalPinMap)/sizeof(pin_map_t);
^
/home/user/Arduino/libraries/SD/src/utility/Sd2PinMap.h: In function 'getPinMode':
/home/user/Arduino/libraries/SD/src/utility/Sd2PinMap.h:455:32: error: request for member 'ddr' in something not a structure or union
return (*digitalPinMap[pin].ddr >> digitalPinMap[pin].bit) & 1;
^
/home/user/Arduino/libraries/SD/src/utility/Sd2PinMap.h:455:58: error: request for member 'bit' in something not a structure or union
return (*digitalPinMap[pin].ddr >> digitalPinMap[pin].bit) & 1;
^
/home/user/Arduino/libraries/SD/src/utility/Sd2PinMap.h: In function 'setPinMode':
/home/user/Arduino/libraries/SD/src/utility/Sd2PinMap.h:464:26: error: request for member 'ddr' in something not a structure or union
*digitalPinMap[pin].ddr |= 1 << digitalPinMap[pin].bit;
^
/home/user/Arduino/libraries/SD/src/utility/Sd2PinMap.h:464:57: error: request for member 'bit' in something not a structure or union
*digitalPinMap[pin].ddr |= 1 << digitalPinMap[pin].bit;
^
/home/user/Arduino/libraries/SD/src/utility/Sd2PinMap.h:466:26: error: request for member 'ddr' in something not a structure or union
*digitalPinMap[pin].ddr &= ~(1 << digitalPinMap[pin].bit);
^
/home/user/Arduino/libraries/SD/src/utility/Sd2PinMap.h:466:59: error: request for member 'bit' in something not a structure or union
*digitalPinMap[pin].ddr &= ~(1 << digitalPinMap[pin].bit);
^
/home/user/Arduino/libraries/SD/src/utility/Sd2PinMap.h: In function 'fastDigitalRead':
/home/user/Arduino/libraries/SD/src/utility/Sd2PinMap.h:475:32: error: request for member 'pin' in something not a structure or union
return (*digitalPinMap[pin].pin >> digitalPinMap[pin].bit) & 1;
^
/home/user/Arduino/libraries/SD/src/utility/Sd2PinMap.h:475:58: error: request for member 'bit' in something not a structure or union
return (*digitalPinMap[pin].pin >> digitalPinMap[pin].bit) & 1;
^
/home/user/Arduino/libraries/SD/src/utility/Sd2PinMap.h: In function 'fastDigitalWrite':
/home/user/Arduino/libraries/SD/src/utility/Sd2PinMap.h:484:26: error: request for member 'port' in something not a structure or union
*digitalPinMap[pin].port |= 1 << digitalPinMap[pin].bit;
^
/home/user/Arduino/libraries/SD/src/utility/Sd2PinMap.h:484:58: error: request for member 'bit' in something not a structure or union
*digitalPinMap[pin].port |= 1 << digitalPinMap[pin].bit;
^
/home/user/Arduino/libraries/SD/src/utility/Sd2PinMap.h:486:26: error: request for member 'port' in something not a structure or union
*digitalPinMap[pin].port &= ~(1 << digitalPinMap[pin].bit);
^
/home/user/Arduino/libraries/SD/src/utility/Sd2PinMap.h:486:60: error: request for member 'bit' in something not a structure or union
*digitalPinMap[pin].port &= ~(1 << digitalPinMap[pin].bit);
^
In file included from /home/user/Arduino/libraries/SD/src/utility/SdFat.h:29:0,
from /home/user/Arduino/libraries/SD/src/SD.h:20,
from sketch/mylib.h:5,
Multiple libraries were found for "SD.h"
Used: /home/user/Arduino/libraries/SD
Not used: /home/user/Programs/arduino/libraries/SD
from sketch/mylib.c:1:
/home/user/Arduino/libraries/SD/src/utility/Sd2Card.h: At top level:
/home/user/Arduino/libraries/SD/src/utility/Sd2Card.h:70:1: error: initializer element is not constant
uint8_t const SD_CHIP_SELECT_PIN = SS;
^
/home/user/Arduino/libraries/SD/src/utility/Sd2Card.h:79:1: error: initializer element is not constant
uint8_t const SPI_MOSI_PIN = MOSI;
^
/home/user/Arduino/libraries/SD/src/utility/Sd2Card.h:81:1: error: initializer element is not constant
uint8_t const SPI_MISO_PIN = MISO;
^
/home/user/Arduino/libraries/SD/src/utility/Sd2Card.h:83:1: error: initializer element is not constant
uint8_t const SPI_SCK_PIN = SCK;
^
/home/user/Arduino/libraries/SD/src/utility/Sd2Card.h:176:1: error: unknown type name 'class'
class Sd2Card {
^
/home/user/Arduino/libraries/SD/src/utility/Sd2Card.h:176:15: error: expected '=', ',', ';', 'asm' or '__attribute__' before '{' token
class Sd2Card {
^
In file included from /home/user/Arduino/libraries/SD/src/utility/SdFat.h:30:0,
from /home/user/Arduino/libraries/SD/src/SD.h:20,
from sketch/mylib.h:5,
from sketch/mylib.c:1:
/home/user/Arduino/libraries/SD/src/utility/FatStructs.h:405:1: error: initializer element is not constant
uint8_t const DIR_ATT_FILE_TYPE_MASK = (DIR_ATT_VOLUME_ID | DIR_ATT_DIRECTORY);
^
In file included from /home/user/.arduino15/packages/arduino/hardware/avr/1.6.21/cores/arduino/Print.h:27:0,
from /home/user/Arduino/libraries/SD/src/utility/SdFat.h:31,
from /home/user/Arduino/libraries/SD/src/SD.h:20,
from sketch/mylib.h:5,
from sketch/mylib.c:1:
/home/user/.arduino15/packages/arduino/hardware/avr/1.6.21/cores/arduino/Printable.h:25:1: error: unknown type name 'class'
class Print;
^
/home/user/.arduino15/packages/arduino/hardware/avr/1.6.21/cores/arduino/Printable.h:33:1: error: unknown type name 'class'
class Printable
^
/home/user/.arduino15/packages/arduino/hardware/avr/1.6.21/cores/arduino/Printable.h:34:1: error: expected '=', ',', ';', 'asm' or '__attribute__' before '{' token
{
^
In file included from /home/user/Arduino/libraries/SD/src/utility/SdFat.h:31:0,
from /home/user/Arduino/libraries/SD/src/SD.h:20,
from sketch/mylib.h:5,
from sketch/mylib.c:1:
/home/user/.arduino15/packages/arduino/hardware/avr/1.6.21/cores/arduino/Print.h:37:1: error: unknown type name 'class'
class Print
^
/home/user/.arduino15/packages/arduino/hardware/avr/1.6.21/cores/arduino/Print.h:38:1: error: expected '=', ',', ';', 'asm' or '__attribute__' before '{' token
{
^
In file included from /home/user/Arduino/libraries/SD/src/SD.h:20:0,
from sketch/mylib.h:5,
from sketch/mylib.c:1:
/home/user/Arduino/libraries/SD/src/utility/SdFat.h:39:1: error: unknown type name 'class'
class SdVolume;
^
/home/user/Arduino/libraries/SD/src/utility/SdFat.h:55:1: error: initializer element is not constant
uint8_t const O_RDONLY = O_READ;
^
/home/user/Arduino/libraries/SD/src/utility/SdFat.h:59:1: error: initializer element is not constant
uint8_t const O_WRONLY = O_WRITE;
^
/home/user/Arduino/libraries/SD/src/utility/SdFat.h:61:1: error: initializer element is not constant
uint8_t const O_RDWR = (O_READ | O_WRITE);
^
/home/user/Arduino/libraries/SD/src/utility/SdFat.h:63:1: error: initializer element is not constant
uint8_t const O_ACCMODE = (O_READ | O_WRITE);
^
/home/user/Arduino/libraries/SD/src/utility/SdFat.h:94:1: error: initializer element is not constant
uint8_t const FAT_FILE_TYPE_MIN_DIR = FAT_FILE_TYPE_ROOT16;
^
/home/user/Arduino/libraries/SD/src/utility/SdFat.h:137:1: error: unknown type name 'class'
class SdFile : public Print {
^
/home/user/Arduino/libraries/SD/src/utility/SdFat.h:137:14: error: expected '=', ',', ';', 'asm' or '__attribute__' before ':' token
class SdFile : public Print {
^
/home/user/Arduino/libraries/SD/src/utility/SdFat.h:431:1: error: unknown type name 'class'
class SdVolume {
^
/home/user/Arduino/libraries/SD/src/utility/SdFat.h:431:16: error: expected '=', ',', ';', 'asm' or '__attribute__' before '{' token
class SdVolume {
^
In file included from /home/user/Arduino/libraries/SD/src/SD.h:21:0,
from sketch/mylib.h:5,
from sketch/mylib.c:1:
/home/user/Arduino/libraries/SD/src/utility/SdFatUtil.h: In function 'FreeRam':
/home/user/Arduino/libraries/SD/src/utility/SdFatUtil.h:43:7: error: 'reinterpret_cast' undeclared (first use in this function)
if (reinterpret_cast<int>(__brkval) == 0) {
^
/home/user/Arduino/libraries/SD/src/utility/SdFatUtil.h:43:7: note: each undeclared identifier is reported only once for each function it appears in
/home/user/Arduino/libraries/SD/src/utility/SdFatUtil.h:43:24: error: expected expression before 'int'
if (reinterpret_cast<int>(__brkval) == 0) {
^
/home/user/Arduino/libraries/SD/src/utility/SdFatUtil.h:45:36: error: expected expression before 'int'
free_memory = reinterpret_cast<int>(&free_memory)
^
/home/user/Arduino/libraries/SD/src/utility/SdFatUtil.h:49:36: error: expected expression before 'int'
free_memory = reinterpret_cast<int>(&free_memory)
^
/home/user/Arduino/libraries/SD/src/utility/SdFatUtil.h: In function 'SerialPrint_P':
/home/user/Arduino/libraries/SD/src/utility/SdFatUtil.h:62:52: error: 'Serial' undeclared (first use in this function)
for (uint8_t c; (c = pgm_read_byte(str)); str++) Serial.write(c);
^
/home/user/Arduino/libraries/SD/src/utility/SdFatUtil.h: In function 'SerialPrintln_P':
/home/user/Arduino/libraries/SD/src/utility/SdFatUtil.h:72:3: error: 'Serial' undeclared (first use in this function)
Serial.println();
^
In file included from sketch/mylib.h:5:0,
from sketch/mylib.c:1:
/home/user/Arduino/libraries/SD/src/SD.h: At top level:
/home/user/Arduino/libraries/SD/src/SD.h:26:1: error: unknown type name 'namespace'
namespace SDLib {
^
/home/user/Arduino/libraries/SD/src/SD.h:26:17: error: expected '=', ',', ';', 'asm' or '__attribute__' before '{' token
namespace SDLib {
^
/home/user/Arduino/libraries/SD/src/SD.h:119:1: error: unknown type name 'using'
using namespace SDLib;
^
/home/user/Arduino/libraries/SD/src/SD.h:119:17: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'SDLib'
using namespace SDLib;
^
/home/user/Arduino/libraries/SD/src/SD.h:123:14: error: expected '=', ',', ';', 'asm' or '__attribute__' before ':' token
typedef SDLib::File SDFile;
^
/home/user/Arduino/libraries/SD/src/SD.h:124:14: error: expected '=', ',', ';', 'asm' or '__attribute__' before ':' token
typedef SDLib::SDClass SDFileSystemClass;
^
In file included from sketch/mylib.c:1:0:
mylib.h:7: error: expected ')' before '&' token
void fn(File &_file);
^
mylib.c:3: error: expected ')' before '&' token
void fn(File &_file)
^
exit status 1
expected ')' before '&' token
If I use SD.h function in mylib, I need this in mylib.h file. Why is it happens?
The first error is about passing object as function argument. I'm following sample I found in others forum, then I don't know why it isn't working.
[SOLVED] I rename mylib.c to mylib.cpp and solved the problem.