CLion Arduino未定义参考

时间:2018-01-20 22:25:05

标签: arduino clion

我已经尝试了关于这个问题的大部分建议都无济于事。

我使用Arduino插件(版本1.2.3)在CLion(版本2017.3.2)中创建了一个Arduino项目。我在构建期间一直得到“未定义的引用”。

我的主要Sample.ino文件是:

#include <Arduino.h>
#include "Hello.h"

void setup() {
}

void loop() {
    Hello::world();
}

和Hello.h只是:

#ifndef SAMPLE_HELLO_H
#define SAMPLE_HELLO_H


struct Hello {
    static void world();
};


#endif //SAMPLE_HELLO_H

Hello.cpp是     #include“Hello.h”

void Hello::world() {
}

和CMakeLists.txt是:

cmake_minimum_required(VERSION 2.8.4)
set(CMAKE_TOOLCHAIN_FILE ${CMAKE_SOURCE_DIR}/cmake/ArduinoToolchain.cmake)
set(PROJECT_NAME Sample)
project(${PROJECT_NAME})

set(${CMAKE_PROJECT_NAME}_SKETCH src/Sample.ino)

#include_directories(include)
include_directories(src)

#### Uncomment below additional settings as needed.
set(${CMAKE_PROJECT_NAME}_BOARD mega)
set(${CMAKE_PROJECT_NAME}_PORT /dev/ttyACM0)
set(mega.build.mcu atmega2560)
# set(mega.upload.protocol wiring)
set(mega.upload.speed 115200)

generate_arduino_firmware(${CMAKE_PROJECT_NAME})

所有源文件都在src /,

文件夹下

有什么建议我错过了什么?

3 个答案:

答案 0 :(得分:2)

我遇到了同样的问题,花了几个小时才找到解决方案。 Arduino插件使用arduino-cmake来构建项目。根据其文档,要使用generate_arduino_firmware命令,应指定SKETCHSRCS选项。

如果我定义SKETCH选项,则无法成功链接其他文件(hello.cpp)。 因此,我尝试使用SRCS。似乎如果我同时定义SKETCHSRCSSRCS将被忽略。另一个问题是,当我在src/sample.ino选项中指定SRCS时,我遇到了相同的错误。 因此,我执行以下操作以成功编译项目:

  1. src/sample.ino重命名为src/sample.cpp
  2. 注释了SKETCH并添加了SRCS选项以列出所有源文件:
set(${PROJECT_NAME}_SRCS src/sample.cpp src/hello.cpp)

完整的CMakeList.txt是

cmake_minimum_required(VERSION 2.8.4)
set(CMAKE_TOOLCHAIN_FILE ${CMAKE_SOURCE_DIR}/cmake/ArduinoToolchain.cmake)
set(CMAKE_CXX_STANDARD 14)
set(PROJECT_NAME Sample)
project(${PROJECT_NAME})

set(${PROJECT_NAME}_BOARD uno)
set(${PROJECT_NAME}_SRCS src/sample.cpp src/hello.cpp)
set(${PROJECT_NAME}_PROGRAMMER arduinoasisp)
set(${PROJECT_NAME}_PORT COM17)
set(${PROJECT_NAME}_AFLAGS -v)

generate_arduino_firmware(${PROJECT_NAME})

答案 1 :(得分:1)

Arduino 支持插件使用 arduino-cmake,它有一个错误,导致您的 SRCSHDRS 在编译草图时被擦除。

您可以阅读我的错误报告和建议的修复 See it work here.。基本上你想修改 cmake/Platform/Arduino.cmake

  1. 更改第 1808 行以避免覆盖您的来源

set(ALL_SRCS ${SKETCH_SOURCES})

set(ALL_SRCS ${ALL_SRCS} ${SKETCH_SOURCES})

  1. 更改第 1821 行以在源代码更改时重新编译

DEPENDS ${MAIN_SKETCH} ${SKETCH_SOURCES}

DEPENDS ${MAIN_SKETCH} ${ALL_SRCS}

答案 2 :(得分:0)

我也有这个问题。 将其添加到CMakeLists使其起作用:

include_directories(${PROJECT_SOURCE_DIR})
file(GLOB SRC_FILES ${PROJECT_SOURCE_DIR}/*.cpp)
file(GLOB HDR_FILES ${PROJECT_SOURCE_DIR}/*.h)

set(PROJ_SRC ${SRC_FILES})
set(PROJ_HDR ${HDR_FILES})

generate_arduino_firmware(${CMAKE_PROJECT_NAME}
    SRCS ${PROJ_SRC}
    HDRS ${PROJ_HDR}
    )

我不确定这是否是最好的解决方案,但对我而言还是行得通的。