Skip to content

Multiple definition of 'main' when including a library with tests #168

Closed
@rosogon

Description

@rosogon

System

Issue Summary

If libB depends on libA, both with arduino_ci tests, trying to run the unit tests on libB will raise the error "multiple definition of main". This happens because cpp_files_libraries returns the whole tree of the referenced library (libA in the example), not removing the files in test/.

Con: Skipping those files can break libraries containing files in test/ (which are needed to use the library). Weird, but could happen.

Arduino or Unit Test Code, Illustrating the Problem

The following repo illustratres the example: https://github.com/rosogon/arduino_ci_two_libraries

libB $ bundle exec arduino_ci_remote.rb --skip-compilation
Located Arduino binary...                     /home/roman/arduino_ci_ide/arduino
[...]
Requested unittest platform 'uno' is defined in 'platforms' YML...             ✓
Using pre-existing library...                                               libA
Unit testing test.cpp with g++... 

Last command:  $ g++ -std=c++0x -o /home/roman/romanfiles/projects/Arduino/arduino_ci_two_libraries/libB/unittest_test.cpp.bin -DARDUINO=100 -g -O1 -fno-omit-frame-pointer -fno-optimize-sibling-calls -fsanitize=address -D__AVR_ATmega328P__ -I/home/roman/romanfiles/projects/Arduino/arduino_ci_two_libraries/.bundle/ruby/2.3.0/gems/arduino_ci-0.3.0/cpp/arduino -I/home/roman/romanfiles/projects/Arduino/arduino_ci_two_libraries/.bundle/ruby/2.3.0/gems/arduino_ci-0.3.0/cpp/unittest -I/home/roman/projects/Arduino/libraries/libA /home/roman/romanfiles/projects/Arduino/arduino_ci_two_libraries/.bundle/ruby/2.3.0/gems/arduino_ci-0.3.0/cpp/arduino/Arduino.cpp /home/roman/romanfiles/projects/Arduino/arduino_ci_two_libraries/.bundle/ruby/2.3.0/gems/arduino_ci-0.3.0/cpp/arduino/Godmode.cpp /home/roman/romanfiles/projects/Arduino/arduino_ci_two_libraries/.bundle/ruby/2.3.0/gems/arduino_ci-0.3.0/cpp/arduino/stdlib.cpp /home/roman/romanfiles/projects/Arduino/arduino_ci_two_libraries/.bundle/ruby/2.3.0/gems/arduino_ci-0.3.0/cpp/unittest/ArduinoUnitTests.cpp /home/roman/romanfiles/projects/Arduino/arduino_ci_two_libraries/libA/test/test.cpp /home/roman/romanfiles/projects/Arduino/arduino_ci_two_libraries/libB/test/test.cpp                                                                                                                         

/tmp/ccFO4mjB.o: In function `std::basic_ostream<char, std::char_traits<char> >& std::flush<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)':
/home/roman/romanfiles/projects/Arduino/arduino_ci_two_libraries/.bundle/ruby/2.3.0/gems/arduino_ci-0.3.0/cpp/unittest/ArduinoUnitTests.h:149: multiple definition of `main'
/tmp/ccudL6dM.o:/home/roman/romanfiles/projects/Arduino/arduino_ci_two_libraries/libA/test/test.cpp:10: first defined here
collect2: error: ld returned 1 exit status
...Unit testing test.cpp with g++                                              ✗
Skipping compilation of examples...                as requested via command line
Failures: 1

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or requestunittest libsThe assert / assure / unittest reporting apparatus is affected

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions