Answered リリースビルドが失敗します。

  • 2012年3月1日 12:55
     
     

    visual studio 2008 MFC ダイアログベース(VC++)をやっています。

    ある半導体メーカーが提供するデバイス制御用のライブラリを使っています。

    デバッグビルドでの作業時には、

    プロパティページ→構成プロパティ→リンカ→入力→追加の依存ファイル

    でライブラリファイルを設定しただけで不都合なく作業が進められていました。リリースビルドを実行するに当たり、リリースビルドのほうでも上記同様に追加の依存ファイルで、デバッグビルドと同じライブラリファイルを指定して、リリースビルドをしているのですがエラーが出て失敗します。そのエラーは、外部参照が未定義というエラーで、その参照先はライブラリファイルに含まれる関数名(関数ポインタ)でした。

    ライブラリを提供しているメーカーに聞いてみたら、それは開発環境の使い方の問題だ、と言われてしまいました。使い方の問題なのでしょうか?

すべての返信

  • 2012年3月1日 15:23
    モデレータ
     
     回答済み

    これだけでは誰にも何ともいえません。

    プリプロセッサ定数が足りていないなど、何らかの設定が異なるから、必要な関数名の修飾が異なり、リンクエラーになっているのだと予想されますが、具体的にどうすれば解決するかは、今の情報からだと回答不能です。
    そのリンクエラーを書けば推測できる人がいるかもしれませんが、絶対に答えが得られるわけではないのでご留意ください。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。

    • 回答としてマーク AnalogTerebi 2012年3月2日 14:54
    •  
  • 2012年3月2日 0:24
     
     回答の候補

    本当にデバッグビルドとリリースビルドを同じ設定にしていますか? 最適化とか異なる部分もあるでしょうが、そこは差し引いて。

    質問者さんが「同じ設定にした」と言ったらそれ以上どうにもなりません。同じかどうかを確認してもらうぐらいしか。

    ということで、そのプロジェクトのプロジェクトファイル(.vcproj)はXMLファイルですので、メモ帳などで開いてみてください。内容はすぐには理解できないかもしれませんが、タグをよく見ればデバッグとリリースとで分かれている部分はすぐに見つかるはずです。そこが意図したものかどうか確認してみてください。

    • 回答の候補に設定 佐祐理 2012年3月26日 23:15
    •  
  • 2012年3月2日 1:53
     
     

    外部から入手したライブラリ(*.lib)を使用しているのですね。
    一般に当該の*.libを使用するためのヘッダーは1種類だけですが、
    提供側が「親切」な場合、ライブラリの本体は2種類のものが供される場合があります。それは

     1.デバッグビルドの *.lib
     2.リリースビルドの *.lib

    ですね、両者は、自分のアプリケーションが

     3.デバッグビルドの場合は1.をリンクする
     4.リリースビルドの場合は2.をリンクする

    のように使うのが一般的です。
    このあたりの認識は、大丈夫ですか(確認)。



  • 2012年3月2日 14:42
     
     

    Azuleanさん、ありがとうございます。

    こちらも細々と正確にお伝えできるわけでもないのですので、確かに掲示板だけでこういう話を解決するのは難しそうですね。

    いちおう、エラーメッセージは

     error LNK2001: 外部シンボル <関数名>  は未解決です。

    です。関数名>は、今回私の使っているライブラリに含まれる関数名です。

  • 2012年3月2日 14:47
     
     

    佐祐理さん、ありがとうございます。

    なにせ、デバッグとリリースとで違う設定をした自覚がないのですが、そもそもデバッグではやらない設定をリリースビルドでやらなければいけないことがあるのかどうかと思ってここへ質問を載せた次第です。(そもそも、デバッグとリリースが同じ設定で良いのかどうか、そんな意味合いです)

    プロジェクトファイル(.vcproj)は、いちおう開いてみましたが、案の定よくわかりませんでした。


  • 2012年3月2日 14:52
     
     

     仲澤さん、ありがとうございます。

    供給元の対応もあまりよくないので(開発環境の使い方の問題だと言われているので)、よくわからないところもあるのですが、見聞きした範囲ではライブラリは一つしかないようです。


  • 2012年3月5日 2:45
     
     
    保障の限りではありませんが、その関数のヘッダー上での宣言をコピペして載せてみると、
    起こりえる原因の範囲をもう少し狭められるかもしれません。
  • 2012年3月26日 14:16
     
     

    libファイルを置くフォルダを変えてみて実験したところ、あるフォルダに置くとエラーが出なくなりました。

    しかし、現象を再現することができなくなってしまいました。つまり、libファイルの保存場所を元の状態に戻してもそれはそれでリリースビルドが通るようになってしまったのです。どうも、不安定です。

  • 2012年3月26日 23:15
     
     
    自称「同じ設定をした」ということでしたが「実は違ってたのでは?」が私の指摘です。改めて設定し直す際に、Debug / Releaseに同じ設定がされたことで動作するようになったのでは?
  • 2012年3月27日 12:54
     
     
    実は、今回の作業中には、visuatu studioの設定はまったくいじっていないのです。単に、「libファイルの場所でも変えてみるか」という思い付きで作業をしてみたら、ワーニングは出るもののエラーは消えたということです。「再現できなくなってしまった」ということも、同じでlibファイルを移動させただけで、設定などはさわっていません。
  • 2012年3月28日 8:35
     
     
    > 「libファイルの場所でも変えてみるか」

    でどこに変えたのかが大事な気がします。
    C#なんかだと、とある場所のライブラリを参照してると思っていたら、何かの拍子にDebugフォルダの下の当該ライブラリが参照されていて
    クリーンにした後(とか他の人がソース管理から落としたあと)はビルドに失敗してしまうことがありました。
    C++は使ったことないですが、同じようなことなのかなと思いました。
  • 2012年3月28日 14:28
     
     

    mars12さん、ありがとうございます。

    参照先が変わってしまうようなこともあるんですね。