c++ リンクエラー

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
sesuna

c++ リンクエラー

#1

投稿記事 by sesuna » 2年前

C++を勉強し始めて数日目の初心者です。

複数のソースファイルに分けてプログラムを動かしたいのですが、
「一週間で身につくC++言語の基本」というサイト
http://cpp-lang.sevendays-study.com/day2.html
の例文をコピペしても動きません。

以下コピペ内容

main.cpp

コード:

#include <iostream>
#include "sample.h"
 
using namespace std;
 
int main()
{
    CSample obj;  // CSampleをインスタンス化
    int num;
     
    cout << "整数を入力して下さい:" << endl;
    cin >> num;
     
    obj.set( num );  // CSampleのメンバ変数をセット
    cout << obj.get() << endl;  // メンバ変数の値を出力
 
    return 0;
}

sample.cpp

コード:

#include "sample.h"
 
void CSample::set(int num)
{
    m_num = num;
}
 
int CSample::get()
{
    return m_num;
}

sample.h

コード:

#ifndef _SAMPLE_H_
#define _SAMPLE_H_
 
// クラス宣言
class CSample
{
public:
    void set(int num);  // m_numに値を設定する
    int get();          // m_numの値を取得する
private:
    int m_num;
};
 
#endif //_SAMPLE_H_

実行後のエラー内容(一部抜粋)

コード:

: undefined reference to `CSample::set(int)'
: undefined reference to `CSample::get()'
: ld returned 1 exit status


MinGWをインストールする時にバージョンの設定をミスしてしまったのかと思い、コマンドプロンプトで確認するも、今の状態が正解なのかも分かりませんでした。

以下コマンドプロンプトのバージョン確認内容

コード:

Microsoft Windows [Version 10.0.22000.556]
(c) Microsoft Corporation. All rights reserved.

C:\Users\Lenovo>gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=c:/mingw/bin/../libexec/gcc/mingw32/9.2.0/lto-wrapper.exe
Target: mingw32
Configured with: ../src/gcc-9.2.0/configure --build=x86_64-pc-linux-gnu --host=mingw32 --target=mingw32 --disable-win32-registry --with-arch=i586 --with-tune=generic --enable-static --enable-shared --enable-threads --enable-languages=c,c++,objc,obj-c++,fortran,ada --with-dwarf2 --disable-sjlj-exceptions --enable-version-specific-runtime-libs --enable-libgomp --disable-libvtv --with-libiconv-prefix=/mingw --with-libintl-prefix=/mingw --enable-libstdcxx-debug --disable-build-format-warnings --prefix=/mingw --with-gmp=/mingw --with-mpfr=/mingw --with-mpc=/mingw --with-isl=/mingw --enable-nls --with-pkgversion='MinGW.org GCC Build-2'
Thread model: win32
gcc version 9.2.0 (MinGW.org GCC Build-2)

C:\Users\Lenovo>g++ -v
Using built-in specs.
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=c:/mingw/bin/../libexec/gcc/mingw32/9.2.0/lto-wrapper.exe
Target: mingw32
Configured with: ../src/gcc-9.2.0/configure --build=x86_64-pc-linux-gnu --host=mingw32 --target=mingw32 --disable-win32-registry --with-arch=i586 --with-tune=generic --enable-static --enable-shared --enable-threads --enable-languages=c,c++,objc,obj-c++,fortran,ada --with-dwarf2 --disable-sjlj-exceptions --enable-version-specific-runtime-libs --enable-libgomp --disable-libvtv --with-libiconv-prefix=/mingw --with-libintl-prefix=/mingw --enable-libstdcxx-debug --disable-build-format-warnings --prefix=/mingw --with-gmp=/mingw --with-mpfr=/mingw --with-mpc=/mingw --with-isl=/mingw --enable-nls --with-pkgversion='MinGW.org GCC Build-2'
Thread model: win32
gcc version 9.2.0 (MinGW.org GCC Build-2)

C:\Users\Lenovo>

調べても分からなかったので、
お力を貸して頂ければ幸いです。
宜しくお願いいたします。



[環境]
os:win11, 64 bit
コンパイラ名:MinGW-gcc
コードエディタ:VSCode

box
記事: 2002
登録日時: 13年前

Re: c++ リンクエラー

#2

投稿記事 by box » 2年前

ビルド時のコマンドを提示してください。
sample.cpp
を正しくコンパイルできているでしょうか。
リンカーからのメッセージは、
set()
とか
get()
とかを呼んでるけど実体がないよ、って言っています。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

sesuna

Re: c++ リンクエラー

#3

投稿記事 by sesuna » 2年前

正しくコンパイル出来ているかと言われ
C++のコンパイルについて更に調べた所、
拡張機能のcode runnnerのjsonファイルに
「*.c」「*.cpp」を追記しなければならない
という事が分かりました。ありがとうございます。
https://qiita.com/kkml_4220/items/210d8bad8a569b8f8194

: undefined reference to `CSample::set(int)'
: undefined reference to `CSample::get()'

上記のエラーは解消できましたが、

: ld returned 1 exit status

はまだ表示されています。

ビルド時のコマンドというのは、
以下の部分で宜しかったでしょうか?
if ($?) { g++ main.cpp *.cpp -o main } ; if ($?) { .\main }

一応、実行結果を全て貼り付けさせて頂きます

PS C:\Users\Lenovo\OneDrive\デスクトップ\C> cd "c:\Users\Lenovo\OneDrive\デスクトップ\C\" ; if ($?) { g++ main.cpp *.cpp -o main } ; if ($?) { .\main }
c:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe: C:\Users\Lenovo\AppData\Local\Temp\ccye7doC.o:main.cpp:(.text+0x0): multiple definition of `main'; C:\Users\Lenovo\AppData\Local\Temp\cchmCj2B.o:main.cpp:(.text+0x0): first defined here
collect2.exe: error: ld returned 1 exit status


宜しくお願いいたします。

box
記事: 2002
登録日時: 13年前

Re: c++ リンクエラー

#4

投稿記事 by box » 2年前

multiple definition of `main'
main関数の定義が複数ある、と言っています。
if ($?) { g++ main.cpp *.cpp -o main } ; if ($?) { .\main }
試しにmain.cppの記述をはずしてみたらどうなるでしょうか。
最後に編集したユーザー box on 2022年3月18日(金) 19:59 [ 編集 1 回目 ]
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: c++ リンクエラー

#5

投稿記事 by みけCAT » 2年前

コンパイルコマンドの main.cpp と *.cpp で main.cpp が二重にコンパイル (リンク) されてしまっているようですね。
main.cpp を消して *.cpp だけにするといいかもしれません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

sesuna

Re: c++ リンクエラー

#6

投稿記事 by sesuna » 2年前

settings.jsonから「"cpp": "cd $dir && g++ $fileName *.cpp -o $fileNameWithoutExt && $dir$fileNameWithoutExt",」の$fileName(main.cpp)を削除→実行後、文字化け→エンコードをshiftJsに設定して開きなおす

で無事、正しく起動できました。

box様、みけCAT様、
ありがとうございました。

返信

“C言語何でも質問掲示板” へ戻る