CLion Arduino 未定义参考

TX *_*X T 1 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();
}
Run Code Online (Sandbox Code Playgroud)

而 Hello.h 只是:

#ifndef SAMPLE_HELLO_H
#define SAMPLE_HELLO_H


struct Hello {
    static void world();
};


#endif //SAMPLE_HELLO_H
Run Code Online (Sandbox Code Playgroud)

Hello.cpp 是 #include "Hello.h"

void Hello::world() {
}
Run Code Online (Sandbox Code Playgroud)

和 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})
Run Code Online (Sandbox Code Playgroud)

所有源文件都在文件夹 src/ 下,

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

小智 5

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

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

  1. 重命名src/sample.inosrc/sample.cpp.
  2. 注释掉SKETCH并添加SRCS选项以列出所有源文件:
set(${PROJECT_NAME}_SRCS src/sample.cpp src/hello.cpp)
Run Code Online (Sandbox Code Playgroud)

完整的 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})
Run Code Online (Sandbox Code Playgroud)