トップ回答者
EXEがLIBファイルとEXPファイルを出力してしまいます

質問
-
いつもお世話になります。
タイトルの通りなのですが、実行ファイルを出力するプロジェクトをビルドすると、通常出力されないLIBファイルとEXPファイルを出力してしまいます。
自分で新規に作ったプロジェクトで発生した問題であればまだ調査可能なのですが、既存の大規模なプロジェクトの1つのモジュールが、既に当該現象になっていました。
EXE側にextern "C" が存在するとこのような現象が発生したような記憶があったのですが、調べてみたところ、この問題ではありませんでした。
どなたかご教授ください。
開発環境は、VC++6.0、WindowsXPです。- 編集済み maechang 2009年12月29日 1:54
回答
-
遅くなりましたが、原因が判明しました。
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
すべての返信
-
タイトルの意味が良く分からないので整理した方が良いような気がしますね。
文書をそのまま受け取ってしまうと「DLLを出力するはずの実行ファイル(EXE)なのにLIBとEXPファイルを出力している」と言う話に
なってしまいますけれど、本当にそれであっていますか?
DLLを作成する為のプロジェクトを使ってビルドをしているのにDLLが出力されず、LIBファイルとEXPファイルだけが出力されているという話ではないのですか?
私も誤字脱字があったりするのでえらそうな事は言えませんけれど、投稿される前に一度推敲して内部事情を聞かなくても理解できるかどうかを確認された方が良いと思います。
ちなみにですが、通常DLLを作成するプロジェクトではDebugやReleaseフォルダにLIBファイルやEXPファイルが普通に作成されますよ。
ビルド後のイベントか何かで別のフォルダに移動とかしていないでしょうか?
解決した時は、参考になったレスポンスの所にある[回答としてマーク]ボタンをクリックしてスレッドを締めましょう。 -
EXEプロジェクトなのに、なぜか必要がないであろうLIBファイルとEXPファイルが作成されるということだと思います。
自分のかかわりのあるプロジェクトでこれらのファイルが出力される設定になっていたものがありました。今でも吐き出されるのかは分りませんが。。。w
ところで、何か不都合があったのでしょうか?私自身はこのファイルがあったことで、おかしな挙動などは目にしていません。
それとも、ビルド時にライブラリも一緒にビルドされてしまうのはなぜか?という話でしょうか?
確実ではありませんが、個人的には、MFCアプリでオートメーションサーバーを作ると作成されるような気がします(確実に沿うかは検証していない<あっても無視してきたため)。
リンカオプションにLIBファイルの出力設定がありますのでそれを確認してみるといいかもしれません。
EXPファイルは、LIBが出力されなくなれば自動的に出力されなくなると思います。
わんくま同盟,Microsoft MVP for Visual C++(Oct 2005-) http://blogs.wankuma.com/tocchann/ -
ご回答ありがとうございます。
ご指摘通り、「EXEプロジェクトなのに、なぜか必要がないであろうLIBファイルとEXPファイルが作成される」です。
今のところ特に不都合は発生していませんし、おかしな挙動も確認していないので気にせずスルーすることも出来るのですが、なぜこのような現象が発生するのかを一応知っておきたい、という感じです。(気にしなくていいよ~と言われたらそれまでなのですが笑)
オートメーションサーバーを作っていないアプリなので、恐らく他に何かありそうです。
リンカオプションを調べてみたのですが、該当するような設定が見つかりませんでした。 -
思い当たるのは
辺りかなぁ。調べたわけじゃありません。 -
なるほど、状況は理解しました。
あいにく私自身はそういう現象に出会った事が無いので良く分からないのですが、
実行ファイル内の関数等でもエクスポートされていれば、外部から呼び出しができると言うような話を聞いた事があるので
実行ファイル内の関数にエクスポート宣言されている物がないかとか、
もしくは明示的にdefファイル等でエクスポート指定している物がないかとか
その辺を調べて見てはいかがでしょう。
あいにくとそのくらいしか思いつかないです。
解決した時は、参考になったレスポンスの所にある[回答としてマーク]ボタンをクリックしてスレッドを締めましょう。 -
思い当たるのは
佐祐理さん、ありがとうございます。
リンカオプションについても調べてみたのですが、
-
ソース コードでキーワード __declspec(dllexport) を使う。
-
.def ファイルで EXPORTS ステートメントを使う。
-
LINK コマンドで、/EXPORT 指定を使う。
今回LIBを出力してしまうプロジェクトとは別に、LIBを出力しない正常なプロジェクトの設定を見比べてみたのですが、依存しているLIBの相違以外に、リンカに関する部分での相違は見受けられませんでした。
また、ソースコードも全検索し、#pragma commentが存在していないことも確認致しました。
-
-
ソースコードの検索とは#includeされた先(コンパイラオプションの/P ですべて展開したもの)も全てでしょうか?
それと/DLLオプションも確認されたのでしょうか?
とりあえずそれ以外は心当たりがないので、他に原因があった場合、私にはわかりません (== -
遅くなりましたが、原因が判明しました。
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