2017-12-14 8 views
1

クロス構築ツールチェーンを使用してwin32スタティックライブラリを構築しようとしました。Win32クロススタティックライブラリからの関数のエクスポート

私はMakefileを介して、オブジェクトファイルとmylib.libファイルを構築しました:

$(program_RELEASE_NAME_WIN_STATIC): $(RELEASE_OBJS_WIN32_STATIC) 
    i686-w64-mingw32-gcc-ar rcs $(BUILD_DIR_WIN32)/static/[email protected] $^ 

$(BUILD_DIR_WIN32)/static/%.o: %.c $(HEADERS) 
    $(RELEASE_LINK_WIN32.c) $< -c -o [email protected] 

これは私の静的ライブラリmylib.libを与えました。 nmでLinux側でこれを検査し、私は私がすなわち

DUMPBIN /EXPORTS mylib.lib 

、窓10 VM上mylib.libを検査するとき私が得るすべての構成オブジェクトファイルと、彼らは

ありませんが含まれている機能を見ることができます:

Microsoft (R) COFF/PE Dumper Version 9.00.30729.01 
Copyright (C) Microsoft Corporation. All rights reserved. 


Dump of file mylib.lib 

File Type: LIBRARY 

    Summary 

      C .bss 
      C .data 
     6AC .drectve 
     5EAC .rdata 
     444 .rdata$zzz 
     29900 .text 
      38 .text.unlikely 

エクスポートされている関数はありません。私は私が私が輸出のためにマークされた関数IEで見えていただけのものだった、.dllファイルを作成されたとき、これはうまく働いた__declspec(dllexport)

でエクスポートする機能をマークアップし、関連するヘッダファイルで

.dllファイル

しかし、静的ライブラリと同等のものは何もエクスポートされていませんか?

Win32の.libファイルでどのように表示されるようにするのですか?

答えて

1

dumpbin /exportsは、実行可能ファイルまたはDLLによってエクスポートされたシンボルをリストします。 the DUMPBIN options documentation

スタティックライブラリは実行可能ファイルまたはDLLではありません。これはUn arアーカイブ形式のオブジェクトファイル (これは同じMS LIB形式)の単なるバッグです。

dumpbinは、COFFバイナリを分析します。あなたが実行すると:

dumpbin /option... static.lib 

はそれが/option...に応じstatic.lib内の各オブジェクトファイルを分析します。 しかし:オブジェクト ファイルがいずれかの実行可能ファイルまたはDLLではありませんので、

dumpbin /exports file.obj 

は、オブジェクト・ファイルfile.objのいずれかの輸出を報告することはありません。ダイナミックシンボルは安定していません。 実行可能ファイルまたはDLLのみがダイナミックリンクのシンボルを公開できます。リンカーによって生成された場合は、 動的シンボルテーブルとともに提供されます。オブジェクトファイルまたはスタティックライブラリを生成する際には、 を手に入れません。

あなたは今、あなたはライブラリのヘッダファイルに__declspec(dllexport)で修飾しているあなたの静的ライブラリ から任意の関数をリンクする実行可能ファイルまたはDLLを構築する場合、 リンカの動的シンボルテーブルにその機能が追加されます 実行可能ファイルまたはDLLを出力し、実行可能ファイルにdumpbin /exports、またはDLLが の場合は、その関数が報告されていることがわかります。

オブジェクトファイルはグローバルシンボルを定義することができます。グローバルシンボル(a.k.a公開/外部シンボル)は、__declspec(dllexport) の資格を持っているかどうかによって、ダイナミックリンケージのためにエクスポートされた である場合とそうでない場合があります。シンボルは、DLLエクスポートにするにはグローバルでなければなりません。

あなたの静的ライブラリにdumpbin /symbolsを実行した場合、それは静的ライブラリ内のすべてのオブジェクトファイル内のすべての のシンボルを報告し、ExternalまたはStaticとしてそれらを 分類されます。 __declspec(dllexport) と修飾されたシンボルは、Externalのシンボルの間に表示されます。

+0

機能は常に表示されていましたか?私はちょうどdumpbin/exportsを使ってそれらを見ることができなくなってしまった。私がリンクしようとしたときに私がこれに帰着した問題は、古くなったヘッダーファイルと.libファイルのwhatsとの間の相違だけであると思うようになりました。ウインカーを外してくれてありがとう.. – bph

関連する問題