我已经尝试了关于这个问题的大部分建议都无济于事。
我使用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 /,
文件夹下有什么建议我错过了什么?
答案 0 :(得分:2)
我遇到了同样的问题,花了几个小时才找到解决方案。
Arduino插件使用arduino-cmake来构建项目。根据其文档,要使用generate_arduino_firmware
命令,应指定SKETCH
或SRCS
选项。
如果我定义SKETCH
选项,则无法成功链接其他文件(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)
完整的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,它有一个错误,导致您的 SRCS
和 HDRS
在编译草图时被擦除。
您可以阅读我的错误报告和建议的修复 See it work here.。基本上你想修改 cmake/Platform/Arduino.cmake
set(ALL_SRCS ${SKETCH_SOURCES})
set(ALL_SRCS ${ALL_SRCS} ${SKETCH_SOURCES})
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}
)
我不确定这是否是最好的解决方案,但对我而言还是行得通的。