我已经尝试了有关此问题的大部分建议,但无济于事。
我使用 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命令,您应该指定SKETCH或SRCS选项。
如果我定义SKETCHoption ,则无法成功链接其他文件(hello.cpp)。所以我尝试使用SRCS. 似乎如果我同时定义SKETCH和SRCS,SRCS是被忽略的。另一个问题是当我src/sample.ino在SRCS选项中指定我有同样的错误。因此,我执行以下操作以成功编译项目:
src/sample.ino为src/sample.cpp.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)