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

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

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

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

Q&A

解決済

2回答

2635閲覧

C++でmakeコマンドでのコンパイルが上手くいきません

kyu

総合スコア13

C++

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

0グッド

0クリップ

投稿2016/08/30 13:47

###前提・実現したいこと
初心者ですがC++の質問をさせてください。
ネットで調べながらmakeコマンドで複数のプログラムを一括コンパイルしようとしたのですがうまくいきません。どうかよろしくお願いします。
###発生している問題・エラーメッセージ

#コマンドプロンプトで表示されたメッセージです $ make g++ human_modeling0829.cpp Undefined symbols for architecture x86_64: "readfile(char*, bonedata)", referenced from: _main in human_modeling0829-164f9e.o ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation) make: *** [human_modeling0829.o] Error 1

###readfile.cpp

C++

1#include "scatter.h" 2#include <iostream> 3#include <stdlib.h> 4#include <fstream> 5 6using namespace std; 7struct bonedata; 8typedef struct bonedata Bonedata; 9 10void readfile(char *str,Bonedata data[50]){ 11 ifstream fin(str); 12 if(!fin) { 13 cout << "ファイルが開けません" << endl; 14 } 15 16 int a; 17 double b; 18 int id = 0; 19 20while(!(fin >> str)){ 21 if(id == 30) break; 22 if(strcmp(str, "begin") == 0){ 23 while(!(fin >> str)){ 24 if(strcmp(str,"id") ==0){ 25 fin >> a; 26 data[id].id = a; 27 id++; 28 } else if(strcmp(str,"name") == 0 ){ 29 fin >> str; 30 strcpy(data[id - 1].name, str); 31 } else if(strcmp(str,"direction") == 0 ){ 32 fin >> b; 33 data[id - 1].direction[0] = b; 34 fin >> b; 35 data[id - 1].direction[1] = b; 36 fin >> b; 37 data[id - 1].direction[2] = b; 38 } else if(strcmp(str,"length") == 0 ){ 39 fin >> b; 40 data[id - 1].length = b; 41 } else if(strcmp(str,"axis") == 0 ){ 42 fin >> b; 43 data[id - 1].axis[0] = b; 44 fin >> b; 45 data[id - 1].axis[1] = b; 46 fin >> b; 47 data[id - 1].axis[2] = b; 48 } else continue; 49 if(strcmp(str, "end") == 0) break; 50 } 51 } 52 } 53}

###human_modeling0829.cpp

C++

1#include <iostream> 2#include <stdio.h> 3#include <fstream> 4#include "scatter.h" 5 6struct bonedata; 7typedef struct bonedata Bonedata; 8 9void readfile(char* ,Bonedata); 10 11int main(int argc, char* argv[]){ 12 Bonedata data[50]; 13 readfile(argv[1],*data); 14 15 std::cout << "hey" << std::endl; 16}

#scatter.h

C++

1#ifndef _SCATTER_H_ 2#define _SCATTER_H_ 3 4//関数のプロトタイプ宣言 5 6struct bonedata { 7 int id; 8 char name[20]; 9 double direction[3]; 10 double length; 11 double axis[3]; 12}; 13 14typedef struct bonedata Bonedata; 15 16 void readfile(char* ,Bonedata); 17 18#endif // _SCATTER_H_

###Makefile

scattering0829: human_modeling0829.o readfile.o g++ -Wall -o scattering0829 human_modeling0829.o readfile.o human_modeling0829.o: human_modeling0829.cpp scatter.h g++ human_modeling0829.cpp readfile.o: readfile.cpp scatter.h g++ readfile.cpp human_modeling0829.cpp: scatter.h readfile.cpp: scatter.h clean: rm human_modeling0829.o readfile.o scattering0829

###試したこと
ヘッダファイルの依存関係も簡単なものだし何が悪いのか見当がつかないです。

###補足情報(言語/FW/ツール等のバージョンなど)

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

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

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

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

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

guest

回答2

0

自己解決

Bonedataという構造体のポインタを関数の引数として渡さないといけないところで構造体の配列を渡したりするミスが原因でした、ポインタへの理解不足ですね。
まだまだ勉強不足だったなと痛感しました、、、

投稿2016/08/30 16:35

kyu

総合スコア13

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

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

0

オブジェクトファイル(*.o)を作るところは-cをオプションにつけてください。-cがない場合は、普通に"a.out"の実行ファイルを作ろうとしてしまいます。できれば、-oで指定もするといいでしょう。

g++ -c -o human_modeling0829.o human_modeling0829.cpp g++ -c -o readfile.o readfile.cpp

と言う風に、Makefileをそれぞれの部分を書き換えればうまくいくと思います。

投稿2016/08/30 14:05

raccy

総合スコア21733

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

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

kyu

2016/08/30 15:06

回答ありがとうございます。 Makefileを以下のように編集して再度コンパイルした結果同様のエラーメッセージが現れました。どうしたらよいでしょうか、もしよろしければ知恵をお貸しください。 scattering0829: human_modeling0829.o readfile.o g++ -Wall -o scattering0829 human_modeling0829.o readfile.o human_modeling0829.o: human_modeling0829.cpp scatter.h g++ -c -o human_modeling0829.o human_modeling0829.cpp readfile.o: readfile.cpp scatter.h g++ -c -o readfile.o readfile.cpp human_modeling0829.cpp: scatter.h readfile.cpp: scatter.h clean: rm human_modeling0829.o readfile.o scattering0829
raccy

2016/08/30 21:22

あれ、うまくいきませんでした。とりあえず、解決されたようで、良かったです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問