none
EXEがLIBファイルとEXPファイルを出力してしまいます RRS feed

  • 質問

  • いつもお世話になります。

    タイトルの通りなのですが、実行ファイルを出力するプロジェクトをビルドすると、通常出力されないLIBファイルとEXPファイルを出力してしまいます。
    自分で新規に作ったプロジェクトで発生した問題であればまだ調査可能なのですが、既存の大規模なプロジェクトの1つのモジュールが、既に当該現象になっていました。
    EXE側にextern "C" が存在するとこのような現象が発生したような記憶があったのですが、調べてみたところ、この問題ではありませんでした。
    どなたかご教授ください。

    開発環境は、VC++6.0、WindowsXPです。
    • 編集済み maechang 2009年12月29日 1:54
    2009年12月28日 4:52

回答

  • 遅くなりましたが、原因が判明しました。

    LIBを出力しているため、これをDependency Walkerで開くと、エクスポートしているクラスが表示されていました。
    (Dependency Walkerでなくても、LIBはバイナリだがテキストで開いても一応確認可能)

    EXEにリンクしているDLLに公開クラスの実体があり、そのクラスがヘッダーに宣言されていたのですが、これが下記のようになっていました。

    class AFX_CLASS_EXPORT CHogeData
    {
    }

    つまり、必ずエクスポートされるようになっていました。

    下記のようにすることで、EXEからLIBが出力されなくなります。
    class AFX_EXT_CLASS CHogeData
    {
    }

    PATIOさん、とっちゃんさん、佐祐理さん、ご親切にどうもありがとうございました。
    無事解決できてスッキリしました!
    • 回答としてマーク maechang 2010年1月12日 12:21
    2010年1月12日 12:21

すべての返信

  • タイトルの意味が良く分からないので整理した方が良いような気がしますね。

    文書をそのまま受け取ってしまうと「DLLを出力するはずの実行ファイル(EXE)なのにLIBとEXPファイルを出力している」と言う話に
    なってしまいますけれど、本当にそれであっていますか?

    DLLを作成する為のプロジェクトを使ってビルドをしているのにDLLが出力されず、LIBファイルとEXPファイルだけが出力されているという話ではないのですか?
    私も誤字脱字があったりするのでえらそうな事は言えませんけれど、投稿される前に一度推敲して内部事情を聞かなくても理解できるかどうかを確認された方が良いと思います。
    ちなみにですが、通常DLLを作成するプロジェクトではDebugやReleaseフォルダにLIBファイルやEXPファイルが普通に作成されますよ。
    ビルド後のイベントか何かで別のフォルダに移動とかしていないでしょうか?

    解決した時は、参考になったレスポンスの所にある[回答としてマーク]ボタンをクリックしてスレッドを締めましょう。
    2009年12月28日 8:28
  • EXEプロジェクトなのに、なぜか必要がないであろうLIBファイルとEXPファイルが作成されるということだと思います。
    自分のかかわりのあるプロジェクトでこれらのファイルが出力される設定になっていたものがありました。今でも吐き出されるのかは分りませんが。。。w

    ところで、何か不都合があったのでしょうか?私自身はこのファイルがあったことで、おかしな挙動などは目にしていません。
    それとも、ビルド時にライブラリも一緒にビルドされてしまうのはなぜか?という話でしょうか?

    確実ではありませんが、個人的には、MFCアプリでオートメーションサーバーを作ると作成されるような気がします(確実に沿うかは検証していない<あっても無視してきたため)。
    リンカオプションにLIBファイルの出力設定がありますのでそれを確認してみるといいかもしれません。
    EXPファイルは、LIBが出力されなくなれば自動的に出力されなくなると思います。

    わんくま同盟,Microsoft MVP for Visual C++(Oct 2005-) http://blogs.wankuma.com/tocchann/
    • 回答としてマーク maechang 2009年12月29日 1:23
    • 回答としてマークされていない maechang 2009年12月29日 1:23
    2009年12月28日 17:37
  • ご指摘通り、タイトルが分かりにくかったです。すみません。

    現象としては、通常実行ファイル(.EXE)だけを出力するはずのプロジェクトが、LIBとEXPファイルも同時に出力してしまいます。

    2009年12月29日 1:22
  • ご回答ありがとうございます。

    ご指摘通り、「EXEプロジェクトなのに、なぜか必要がないであろうLIBファイルとEXPファイルが作成される」です。
    今のところ特に不都合は発生していませんし、おかしな挙動も確認していないので気にせずスルーすることも出来るのですが、なぜこのような現象が発生するのかを一応知っておきたい、という感じです。(気にしなくていいよ~と言われたらそれまでなのですが笑)

    オートメーションサーバーを作っていないアプリなので、恐らく他に何かありそうです。
    リンカオプションを調べてみたのですが、該当するような設定が見つかりませんでした。
    2009年12月29日 1:52
  • 思い当たるのは
    辺りかなぁ。調べたわけじゃありません。
    2009年12月29日 1:57
  • なるほど、状況は理解しました。

    あいにく私自身はそういう現象に出会った事が無いので良く分からないのですが、
    実行ファイル内の関数等でもエクスポートされていれば、外部から呼び出しができると言うような話を聞いた事があるので
    実行ファイル内の関数にエクスポート宣言されている物がないかとか、
    もしくは明示的にdefファイル等でエクスポート指定している物がないかとか
    その辺を調べて見てはいかがでしょう。
    あいにくとそのくらいしか思いつかないです。

    解決した時は、参考になったレスポンスの所にある[回答としてマーク]ボタンをクリックしてスレッドを締めましょう。
    2009年12月29日 2:06
  • 実行ファイル内の関数等でもエクスポートされていれば、外部から呼び出しができると言うような話を聞いた事があるので
    VC++ 6ということでnativeなEXEですが、構造上 export tableは持てなかったように理解していましたが…。
    .NETだとEXE / DLLに関係なくmetadataを参照できるのでリンクできることは確認してます。(というか有効活用してます。)
    2009年12月29日 2:11
  • 思い当たるのは
    佐祐理さん、ありがとうございます。
    リンカオプションについても調べてみたのですが、
    1. ソース コードでキーワード __declspec(dllexport) を使う。

    2. .def ファイルで EXPORTS ステートメントを使う。

    3. LINK コマンドで、/EXPORT 指定を使う。

    上記どれも該当しませんでした。
    今回LIBを出力してしまうプロジェクトとは別に、LIBを出力しない正常なプロジェクトの設定を見比べてみたのですが、依存しているLIBの相違以外に、リンカに関する部分での相違は見受けられませんでした。

    また、ソースコードも全検索し、#pragma commentが存在していないことも確認致しました。

    2009年12月29日 2:21
  • ソースコードの検索とは#includeされた先(コンパイラオプションの/P ですべて展開したもの)も全てでしょうか?
    それと/DLLオプションも確認されたのでしょうか?

    とりあえずそれ以外は心当たりがないので、他に原因があった場合、私にはわかりません (==
    2009年12月29日 2:28
  • 「ソースコードを全検索し」と言う所で気になったのですが、

    依存しているLIBがあると言う事は関連しているヘッダーファイルをインクルードしていると言う事になると思います。
    もしかしてインクルードしているほかのプロジェクト内のヘッダーファイル等に該当する記述があると言う事は
    ありえないでしょうか。全検索と言うのがどの範囲を指しているのかがわからなかったので念の為ですけれど。

    解決した時は、参考になったレスポンスの所にある[回答としてマーク]ボタンをクリックしてスレッドを締めましょう。
    2009年12月29日 2:30
  • PATIOさん、説明不足で面倒をお掛けしてすみません。

    実は今回の質問を投稿する前に、実行ファイル内にエクスポート宣言がないか確認しました。
    3箇所エクスポート宣言されているところがあり、エクスポート宣言を削除してビルドしてみたのですが、LIBとEXPが出力される現象は何も変わりませんでした。


    2009年12月29日 4:25
  • 佐祐理さん、PATIOさん、明けましておめでとうございます。
    インクルード先の件、ご指摘ありがとうございます。(遅くなり申し訳ありません)

    ご指摘通り、インクルード先は完全にノーマークでした汗
    ヘッダーにエクスポート宣言と関数の実体がインラインになっている可能性があり得るかもしれません。
    (インライン以外は気にしなくて良いですよね?)
    2010年1月4日 1:00
  • 遅くなりましたが、原因が判明しました。

    LIBを出力しているため、これをDependency Walkerで開くと、エクスポートしているクラスが表示されていました。
    (Dependency Walkerでなくても、LIBはバイナリだがテキストで開いても一応確認可能)

    EXEにリンクしているDLLに公開クラスの実体があり、そのクラスがヘッダーに宣言されていたのですが、これが下記のようになっていました。

    class AFX_CLASS_EXPORT CHogeData
    {
    }

    つまり、必ずエクスポートされるようになっていました。

    下記のようにすることで、EXEからLIBが出力されなくなります。
    class AFX_EXT_CLASS CHogeData
    {
    }

    PATIOさん、とっちゃんさん、佐祐理さん、ご親切にどうもありがとうございました。
    無事解決できてスッキリしました!
    • 回答としてマーク maechang 2010年1月12日 12:21
    2010年1月12日 12:21