[c++]ライブラリファイル内の未解決外部シンボルについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
purin52002
記事: 235
登録日時: 2年前
連絡を取る:

[c++]ライブラリファイル内の未解決外部シンボルについて

#1

投稿記事 by purin52002 » 2年前

こんばんは、今回は大嫌いな未解決外部シンボルについて質問があります。
  1. staticなメンバ変数を持つクラス
  2. 1を継承したクラス
上の二つのようなクラスをライブラリ化しました。
これらは二つともビルドできたのですが、
これら二つを利用してプログラムを書くと"メンバ変数は未解決です"というエラーが出ます。

片方だけを利用するとビルドできるので、おそらくstaticメンバ変数が二重定義されている(同じソースファイルが二度読まれている)んじゃないかなとアタリをつけています。
、、、つけてるだけで確信はないのですが^^;

というわけで、今回の質問です。
  • ソースファイル(というよりオブジェクトファイル?)を二重に読み込まないようにする方法はあるか?
  • そもそもほかに解決方法があったりするのか?
よろしくお願いします<(_ _)>
c++初心者を自負しています。
質問者さんには今後私にプログラミングを教えてくれるようにやさしく丁寧に教えるつもりです。ぎぶあんどていく^p^
回答者さんには精一杯感謝します。ぎぶおんりー^p^

かずま

Re: [c++]ライブラリファイル内の未解決外部シンボルについて

#2

投稿記事 by かずま » 2年前

purin52002 さんが書きました:これら二つを利用してプログラムを書くと"メンバ変数は未解決です"というエラーが出ます。
"メンバ変数は未解決”というエラーなら、
メンバ変数は二重定義どころか、一度も定義されていないということです。
エラーが出るというコードを見せてください。

試しに次のようなコードを書いてみましたが、エラーは出ません。

ab.h

コード:

#ifndef AB_H
#define AB_H

class A {  // class A の宣言
public:
    static int x;  // staticメンバ変数の宣言
};

class B : public A {  // class A を継承した class B の宣言

};
#endif // AB_H
ab.cpp

コード:

#include "ab.h"

int A::x = 3;  // staticメンバ変数の定義
main.cpp

コード:

#include <iostream>
#include "ab.h"

int main()
{
    A a;
    std::cout << a.x << std::endl;

    B b;
    std::cout << b.x << std::endl;
}

アバター
purin52002
記事: 235
登録日時: 2年前
連絡を取る:

Re: [c++]ライブラリファイル内の未解決外部シンボルについて

#3

投稿記事 by purin52002 » 2年前

かずまさん
返信ありがとうございます。

未解決はやっぱり未定義なんですね^^;
自分でいろいろ検証したところ、自己解決してしまいました。(申し訳ないです。

問題はコードではなくリンカのほうにあったようです。

私はvisualstudio2015で開発をしています。
ライブラリファイルを2つ(A,Bとします)利用するためにライブラリがあるディレクトリのパスをプロパティで設定しました。

どうやらこのディレクトリの中にゴミが混ざっていたようで、

Adir->A
Bdir->B,A(!?)

のようにBのディレクトリにAのライブラリが混ざっていたのです。
で、Bディレクトリの中にあるAが読み込まれて変なことになっていたようです。

Bディレクトリ内のAを削除したところ未解決エラーは出なくなりました。
お騒がせして申し訳ないですorz

お早い回答ありがとうございました^^
c++初心者を自負しています。
質問者さんには今後私にプログラミングを教えてくれるようにやさしく丁寧に教えるつもりです。ぎぶあんどていく^p^
回答者さんには精一杯感謝します。ぎぶおんりー^p^

返信

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