none
未解決の外部シンボルについて RRS feed

  • 質問

  • 現在画像処理を勉強していてQPtoolkitを用いてマーカーの座標取得を工学ナビというサイトのソースコードを用いて試してみようと思っています。
    環境はVisual Studio 2017、Boost1.70、ARtoolkit2.7.1、openCV2.0を使っています。自分のわかる範囲でプロジェクトの設定でインクルードファイルやライブラリファイルを追加してみました。すると以下のようなリンクエラーが出ます。

    LNK2019 未解決の外部シンボル "public: class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __thiscall Network::read_message(void)" (?read_message@Network@@QAE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@XZ) が関数 "void __cdecl Server(class Network &)" (?Server@@YAXAAVNetwork@@@Z) で参照されました。 QPServer C:\Users\araki\Downloads\QPServer106_source\QPServer106_source\QPServer\QPServerDlg.obj1

    おそらくネットワークについてだと考えてBoostのリンクが足りていないなど考えているのですが、どのように解決したらよいかわかりません。ちなみに何かの追加依存ファイルができていない、というのはなんとなくわかっていますが、この関数がどのlibファイルに当てはまるか見当もつきません。
    どなたかご教授お願い致します。

    2019年6月13日 8:37

すべての返信

  • C:\Users\araki\Downloads\QPServer106_source\QPServer106_source\QPServer\Network\Network.cppもコンパイル・リンクする必要がありますが、不足していませんか?
    2019年6月13日 22:49
  • コンパイルはできています。また、プロパティの追加のインクルードファイルにC:\Users\araki\Downloads\QPServer106_source\QPServer106_source\QPServer\Networkを入れているのですが同じようなエラーが出ます。

    コンパイル・リンクというのは私の記述したこととは違うのでしょうか?

    2019年6月14日 6:19
  • インクルードとコンパイルは別です。どのように質問者さんのコンパイル方法が提示されないことには、どのように修正すればよいのかも提案できません。
    2019年6月14日 21:57
  • やりたい事はQPServerをVisual Studio 2017(最新環境)でコンパイルする事で間違いないですか?
    既に大ヒントがあるので、教えすぎも良くないと思いますが、結論はサブフォルダにあるNetwork.cppをコンパイルしてない可能性が高いです。

    エラーメッセージが、QPServerDlg.cppから参照されたNetwork::read_messageという関数の実装がありません(≒ソースがコンパイルされてない)だからです。

    >コンパイル・リンクというのは私の記述したこととは違うのでしょうか?

    違います。
    コンパイルは関数の宣言(Network.h)さえインクルードしたら通りますが、リンクは関数の中身(Network.cpp)がないと通りません。
    QPServerのソースをダウンロードしたら、Network::read_messageだけ別フォルダにソースコードあったので自分でプロジェクト作り直すと忘れるかもしれないですね。(そんな事する必要ないですが)

    2019年6月15日 15:06
  • 返信ありがとうございます。

    私がNetwork.cppをコンパイルをしたと勘違いしていたということですね。私はコンパイルを行うときにソリューションのビルドやソリューションエクスプローラーの中にあるNetwork.cppを右クリック→コンパイルしていたのですがこの方法では違うのでしょうか?

    2019年6月17日 11:22
  • 返信ありがとうございます。

    私の行ったコンパイル方法はソリューションのビルドやソリューションエクスプローラーの中にあるNetwork.cppを右クリック→コンパイルを押していました。この方法をコンパイルと勘違いしているのでしょうか?

    2019年6月17日 11:23
  • 方法は正しいですが、コンパイルを通そうと、string Network::read_messageの実装(Network.cppの168行目)を消しちゃってませんか。

    1.69使って同じ事やってみましたが、その部分がコンパイルできないんですよね。
    その修正ですが
        boost::array<char, 2048> buf;

        std::array<char, 2048> buf;
    に変えたら1.69でいけました。

    1.70は試してないです。

    2019年6月17日 13:44
  • (質問者さんはソースコードを書き替えたとは述べていませんが、)boost::arrayでエラーになる原因ですが、

    boost 1.44.0以降を使う場合、

    Reduced compile times. (Note that some programs may need to add additional #includes, e.g. if the program uses boost::array but does not explicitly include <boost/array.hpp>.)

    という変更に追従する必要があります。

    2019年6月18日 4:47
  • 何度も返信ありがとうございます。

    string Network::read_message()の部分を消していました。

    記述していただいた通りに変更すると解決することができました。

    boostのバージョンが違うことによっておこるエラーなのですね。

    知識不足で説明不足が多かったと思われますが何度もご教授いただきまして本当にありがとうございました。

    2019年6月18日 9:34
  • 何度も返信ありがとうございます。

    上の方の記述に従い変更したところ解決することができました。

    説明不足が多かったと思いますが何度もご教授していただいてありがとうございました。

    2019年6月18日 9:36
  • shin___1999さん、こんにちは。フォーラムオペレーターのHarukaです。
    MSDNフォーラムにご投稿くださいましてありがとうございます。

    本件、konuma さんと佐祐理さんより参考になる投稿が寄せられたようでなによりです。

    [回答としてマーク]機能は設定された投稿が後から参照しやすくなりますので、
    同じ問題でお困りの方のためにも参考になった投稿に設定いただけますと幸いです。

    お手数ですが、ご協力の程どうかよろしくお願いいたします。


    MSDN/ TechNet Community Support Haruka

    ~参考になった投稿には「回答としてマーク」をご設定ください。なかった場合は「回答としてマークされていない」も設定できます。同じ問題で後から参照した方が、情報を見つけやすくなりますので、
    ご協力くださいますようお願いいたします。また、MSDNサポートに賛辞や苦情がある場合は、MSDNFSF@microsoft.comまでお気軽にお問い合わせください。~

    2019年6月21日 2:36
    モデレータ