質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

Q&A

解決済

3回答

6960閲覧

自作ライブラリの勉強中に出たエラーの理由と対処法が知りたいです。(Arduino)

arumiti_1221

総合スコア6

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

0グッド

0クリップ

投稿2020/02/27 22:52

編集2020/02/28 07:36

#やりたいこと
自作ライブラリのメソッドを使う実験として、LEDを常時点灯させるメソッドを作りました。
4回のLチカ後に、常時点灯させることが目標です。

#実際のコード
まずはinoファイルから

test

1#include <Arduino.h> 2#include <FlashLib.h> 3 4void setup(){ 5 pinMode(13,OUTPUT); 6} 7 8void loop(){ 9 for (int i = 1; i<=4; i++){ 10 digitalWrite(13,HIGH); 11 delay(100); 12 digitalWrite(13,LOW); 13 delay(100); 14 } 15 flash(); 16}

次に、ソースファイル(.cpp)

FlashLib

1#include "Arduino.h" 2#include "FlashLib.h" 3 4void flash(){ 5 digitalWrite(13,HIGH); 6 delay(5000);//追加しました 7}

最後に、ヘッダファイル(.h)

FlashLib

1#ifndef _FlashLib_h 2#define _FlashLib_h 3 4#include "Arduino.h"//追加しました 5void flash(); 6 7#endif

これらのスケッチを実行すると以下のようなエラーを吐きます。

error

1libraries\lib_test\FlashLib.cpp.o (symbol from plugin): In function `flash()': 2 3(.text+0x0): multiple definition of `flash()' 4 5sketch\FlashLib.cpp.o (symbol from plugin):(.text+0x0): first defined here 6 7collect2.exe: error: ld returned 1 exit status 8 9exit status 1 10ボードArduino Unoに対するコンパイル時にエラーが発生しました。

#考えたこと
1.エラーの3行目にsketch\FlashLib.cpp.oとあることから、実際には.cppではなく.oである
→しかし、エクスプローラの画面では拡張子が.cppとなっている

2.ArduinoIDEがライブラリとして認識していない
→librariesに入れた他、ライブラリを追加として表示される

3.メソッドの書き方が間違っている
→void flash(void)
returnはなし。として記述もしました。
しかし、初心者日曜プログラマーなのでメソッドの書き方がおかしいことは否めない・・・

4.ヘッダファイルとソースファイルを書いたタブの順番により読み込み順序が逆になることからくるエラー
→そんなばかな・・・というかどうやって変えるねん!!

といった状況で解決方法が全然わかりません。
解決方法を伝授してくださると幸いです。よろしくおねがいします。

※2/28、16時現在一部追加しました

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

自作のライブラリを恐らく「lib_test.zip」で追加されたのだと思いますが、それとは別に、FlashLib.cppファイルを普通に追加していませんか?

以下のエラーはライブラリ中のlibraries\lib_test\FlashLib.cpp.oをリンクしようとすることで報告されているものであり、

`libraries\lib_test\FlashLib.cpp.o (symbol from plugin): In function `flash()':` (.text+0x0): multiple definition of `flash()'

flashが最初に定義(first defined here)されているのは、sketch\FlashLib.cpp と報告されています。

sketch\FlashLib.cpp.o (symbol from plugin):(.text+0x0): first defined here

今いちど、Arduinoプロジェクトのファイル構成を確認してみてください。


** 追記しました:**

改めてこちらでも確認してみましたが、問題なくコンパイル~ビルドできます。以下の手順で再度試してみてください。Arduino 1.8.5/ Windows 10 です。

※混乱を避けるため、既に配置済みのライブラリ「Arduino/libraries/lib_test/」は削除しておいてください。

尚、#includeの部分などコードの一部を整理しています。

1.Arduino IDEの「ファイル」メニューから「新規ファイル」でスケッチを作成し、保存する。

C++

1// Arduino/sketch_feb28a/sketch_feb28a.ino 2 3#include <Arduino.h> 4#include <FlashLib.h> 5 6void setup(){ 7 pinMode(13,OUTPUT); 8} 9 10void loop(){ 11 for (int i = 1; i<=4; i++){ 12 digitalWrite(13,HIGH); 13 delay(100); 14 digitalWrite(13,LOW); 15 delay(100); 16 } 17 flash(); 18} 19

2.次の2つのファイルを「lib_test.zip」の名前でZIPファイルにする。
1つ目、hファイル。

C++

1// Arduino/libraries/lib_test/FlashLib.h 2 3#ifndef _FlashLib_h 4#define _FlashLib_h 5 6void flash(void); 7 8#endif

2つ目、cppファイル。

C++

1// Arduino/libraries/lib_test/FlashLib.cpp 2 3#include <Arduino.h> 4#include <FlashLib.h> 5 6void flash(void){ 7 digitalWrite(13,HIGH); 8 delay(5000);//追加しました 9}

3.「スケッチ」メニューの「ライブラリをインクルード」→「ZIP形式のライブラリをインクルード」で、lib_test.zipを指定して取り込む。

4.「スケッチ」メニューの「検証・コンパイル」を実行する。~ビルド終了。

投稿2020/02/28 00:15

編集2020/02/28 11:16
dodox86

総合スコア9183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

arumiti_1221

2020/02/28 07:53 編集

ご回答ありがとうございます フォルダtest_libからcppとhを取り除いてlibrariesに移動したところ以下のエラーが表示されました C:\Users\takaki\AppData\Local\Temp\ccFsQnvZ.ltrans0.ltrans.o: In function `loop': C:\Users\takaki\作業部屋\プログラム\Arduino\lib_test/lib_test.ino:15: undefined reference to `lflash()' collect2.exe: error: ld returned 1 exit status exit status 1 ボードArduino Unoに対するコンパイル時にエラーが発生しました。 なぜloop()でもエラーが発生してしまったのでしょうか? ご教授お願いします flash()はlflash()に変更しました
dodox86

2020/02/28 08:01 編集

何か色々と手順を間違えているのだと思います。ライブラリとしてはlibrariesフォルダー下のものを使うはずで、*.inoと同じフォルダーにFFlashLib.cpp と FlashLib.hがあるのはおかしいですよね。それでリンク時に重複エラーになってしまうのではないでしょうか。flash()をlflash()に名前を変えてもエラーになるのですよね。
dodox86

2020/02/28 07:58

ライブラリにした手順が間違っているのではないですか。手順を質問文に追記してください。
dodox86

2020/02/28 08:25

ちなみに今度のエラーは最初のエラーとは違って、「リンク時にlflash()が見つからない」と言うものです。最初のは「リンク時にflash()が重複している」です。
arumiti_1221

2020/02/28 16:09

lib_testフォルダに.ino、.h、.cppがすべて入っていたり、librariesに.inoファイルや色々ダブって生成されていることが問題のようでした 解決しました!ありがとうございます!
guest

0

私自身は Arduino を持っていないので実際に試したわけではないということはお断りしておきます。

拡張子が .o のファイルはオブジェクトファイルです。 C では原則として各コンパイル単位 (拡張子が .c のソースファイル) ごとにコンパイルして最後に結合 (リンク) するという手順が取られ、各コンパイル単位をコンパイルしたファイルが .o です。 エラーメッセージが .o のファイルを示しているということはオブジェクトファイルを処理するときに出たエラー、すなわちリンク時のエラーであることが推察されます。

flash という名前の関数は標準ライブラリが提供している関数に有ります。 それと同じ名前が複数定義されている、つまり multiple definition というエラーです。

自分が定義する名前として flash を避けることで対処可能なはずです。

投稿2020/02/27 23:28

SaitoAtsushi

総合スコア5444

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

arumiti_1221

2020/02/28 07:50

ご回答ありがとうございます lib_testフォルダ内にtest.ino、FlashLib.cpp、FlashLib.hがあり、librariesフォルダ内にもlib_testが入ってました。 取り除いたところ、エラーとして ```error lib_test:2:10: fatal error: FlashLib.h: No such file or directory compilation terminated. exit status 1 FlashLib.h: No such file or directory ``` が表示されております… flash()はlflash()に変更しました ありがとうございます
guest

0

そもそも「ライブラリ」という言葉を若干勘違いしているように思います。

厳密にそうでなければいけないというわけではありませんが、ライブラリというのは主に「いろいろなプログラムで使えるパーツ」を意図してパッケージにするものです。
Arduinoでは(何か所かにある)librariesディレクトリ以下にライブラリ名のディレクトリを作成して、そこにライブラリ名.hのファイルがあればライブラリとして認識してIDEの[スケッチ]メニューから取り込めるようですね。

一方、IDEのタブに書くのはライブラリじゃなくてソースファイルを分割したもの、でしょう。今回の、特定のプログラムの一部を整理して見やすいように、管理しやすいように切り分けたもの、です。

この両方をごっちゃにして、しかも両方に同じ内容を記述してしまったのでしょうか。

投稿2020/03/02 12:53

thkana

総合スコア7629

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問