Giter VIP home page Giter VIP logo

Comments (4)

MrPointer avatar MrPointer commented on May 23, 2024

@dominicap Hello and sorry for the long delay, been extremely busy lately.
First of, the toolchain file must be passed by command line. While setting it as a variable inside a CMake script may work - It's not officially supported by the framework and in-fact is quite discouraged.

As for the actual error - I'd bet on misuse of the add_arduino_library function, as it expects sources, not headers. It's explained by the natural way of CMake - Each target must consist of at least one source file, otherwise it just won't be a valid binary (Might compile but definitely not link).
I'm not familiar with any Arduino libraries at all, so I must point it out - If these libraries you're using are header-only libs, i.e. they're consisted of a single (maybe multi) header file.
When that is the case, Arduino-CMake expects you to call the add_arduino_header_only_library function instead to create a header-only library target. You can read more about it here.

from arduino-cmake-ng.

dominicap avatar dominicap commented on May 23, 2024

@MrPointer Thank you for helping me out! I updated my project as defined in the wiki and it is available to clone here. I'm still having issues however.

Building results in this:

====================[ Build | auto_car | Default ]==============================
/usr/local/bin/cmake --build /Users/Dominic/Desktop/auto-car/build --target auto_car -- -j 4
[ 73%] Built target mega_atmega2560_core_lib
Scanning dependencies of target adafruit_vl53l0x
Scanning dependencies of target adafruit_bno055
[ 82%] Built target Wire
[ 85%] Building CXX object CMakeFiles/adafruit_vl53l0x.dir/libs/Adafruit_VL53L0X/src/Adafruit_VL53L0X.cpp.obj
[ 88%] Building CXX object CMakeFiles/adafruit_bno055.dir/libs/Adafruit_BNO055/src/Adafruit_BNO055.cpp.obj
In file included from /Users/Dominic/Desktop/auto-car/libs/Adafruit_BNO055/src/Adafruit_BNO055.cpp:29:0:
/Users/Dominic/Desktop/auto-car/libs/Adafruit_BNO055/src/Adafruit_BNO055.h:33:19: fatal error: Wire.h: No such file or directory
compilation terminated.
In file included from /Users/Dominic/Desktop/auto-car/libs/Adafruit_VL53L0X/src/Adafruit_VL53L0X.cpp:32:0:
/Users/Dominic/Desktop/auto-car/libs/Adafruit_VL53L0X/src/Adafruit_VL53L0X.h:28:18: fatal error: Wire.h: No such file or directory
compilation terminated.
make[3]: *** [CMakeFiles/adafruit_bno055.dir/libs/Adafruit_BNO055/src/Adafruit_BNO055.cpp.obj] Error 1
make[3]: *** [CMakeFiles/adafruit_vl53l0x.dir/libs/Adafruit_VL53L0X/src/Adafruit_VL53L0X.cpp.obj] Error 1
make[2]: *** [CMakeFiles/adafruit_bno055.dir/all] Error 2
make[2]: *** Waiting for unfinished jobs....
make[2]: *** [CMakeFiles/adafruit_vl53l0x.dir/all] Error 2
make[1]: *** [CMakeFiles/auto_car.dir/rule] Error 2
make: *** [auto_car] Error 2

My CMakeLists.txt:

cmake_minimum_required(VERSION 3.13.3)
project(auto_car LANGUAGES C CXX)

get_board_id(board_id mega atmega2560)

add_arduino_executable(auto_car ${board_id} src/auto_car.cpp)

add_arduino_header_only_library(adafruit_sensor ${board_id} libs/Adafruit_Sensor/src/Adafruit_Sensor.h)
add_arduino_library(adafruit_bno055 ${board_id} libs/Adafruit_BNO055/src/Adafruit_BNO055.cpp)
add_arduino_library(adafruit_vl53l0x ${board_id} libs/Adafruit_VL53L0X/src/Adafruit_VL53L0X.cpp)

link_platform_library(auto_car Wire ${board_id})

link_arduino_library(auto_car adafruit_sensor ${board_id} HEADER_ONLY)
link_arduino_library(auto_car adafruit_bno055 ${board_id})
link_arduino_library(auto_car adafruit_vl53l0x ${board_id})

My source file:

#include <Arduino.h>

#include <Adafruit_BNO055.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_VL53L0X.h>

#define BAUD_RATE 9600

Adafruit_BNO055 bno055 = Adafruit_BNO055(55);
Adafruit_VL53L0X vl53L0X = Adafruit_VL53L0X();

void setup()
{
    Serial.begin(BAUD_RATE);

    if (!vl53L0X.begin()) {
        Serial.println("Error: Lidar sensor is not setup properly.");
    }

    if (!bno055.begin()) {
        Serial.println("Error: IMU sensor is not setup properly.");
    }
}

void loop()
{
    // Loop
}

Further, CLion seems unable to find the Adafruit_BNO055.h and Adafruit_VL53L0X.h, hence why its probably failing to correctly link and build.

screen shot 2019-02-25 at 2 37 26 pm

Any help would be much appreciated, thanks!

from arduino-cmake-ng.

MrPointer avatar MrPointer commented on May 23, 2024

@dominicap I've played a bit with your project and managed to get it working 😄

But first, let me make some things clear about CMake targets in general:
CMake targets have certain rules which you must play by in order to get what you want.
While in our heads we imagine that linking one target to another will propagate the linked target and all of its properties to all the other targets linked together (as you did with linking Wire to the executable), cmake doesn't work like that. Instead, it only propagates targets up the hierarchy tree, not across. What it means is that for a target to link to many other targets, the best strategy will be to link it to the most deep-nested target so it'll propagate it upwards.
Just to make things a bit clearer, imagine the Wire target in your case, which is needed by all library targets as well as the executable. The correct strategy cmake-wise would be to link it to the library targets (Both of them as they do not depend on each other), and then link the libraries themselves to the executable target. Depending on the propagation scope (Public by default), the Wire library will or will not be linked against the executable as well.

Now, as for Arduino-CMake's framework behavior regarding libraries:
The add_arduino_library function should be treated with great care, and it's probably best not to use it if an option to use the find_arduino_library exists. Some of the reasons for this are described here.
What's "missing" from that page is the fact that add_arduino_library requires you to specify not only the main source file of the library, but all of them, including those in sub-dirs such as utility.
find_arduino_library does that automatically, hence is more recommended to use.

Now for the fun part - Here's a CMakeLists.txt for your project which "just works", assuming your libraries are located under the libraries directory (as opposed to your libs directory, the reason for it is described here):

cmake_minimum_required(VERSION 3.13.3)
project(auto_car LANGUAGES C CXX)

get_board_id(board_id mega atmega2560)

add_arduino_executable(auto_car ${board_id} src/auto_car.cpp)

add_arduino_header_only_library(adafruit_sensor ${board_id} libraries/Adafruit_Sensor/src/Adafruit_Sensor.h)

find_arduino_library(adafruit_bno055 Adafruit_BNO055 ${board_id} 3RD_PARTY)
find_arduino_library(adafruit_vl53l0x Adafruit_VL53L0X ${board_id} 3RD_PARTY)

link_platform_library(adafruit_bno055 Wire ${board_id})
link_platform_library(adafruit_vl53l0x Wire ${board_id})

link_arduino_library(adafruit_bno055 adafruit_sensor ${board_id} HEADER_ONLY)

link_arduino_library(auto_car adafruit_bno055 ${board_id})
link_arduino_library(auto_car adafruit_vl53l0x ${board_id})

from arduino-cmake-ng.

dominicap avatar dominicap commented on May 23, 2024

@MrPointer Thank you for taking the time to help me fix the problem as well as understand the concepts behind it, I really appreciate it!

from arduino-cmake-ng.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.