2012-01-06 4 views
1

私は何をしようとしていますか? ...Mingwは静的ライブラリリンクをVS2008プロジェクトに作成しましたか?

まず、MinGWのg ++​​コンパイラで静的ライブラリを作成します。

ので、簡単な例のファイルがある...

TEST.H

#ifndef EXAMPLE_H 
#define EXAMPLE_H 

#include <iostream> 

#ifdef __cplusplus 
extern "C" { 
#endif 

#ifdef EXPORT_DLL_FUNCT 
#define DLL_API __declspec(dllexport) 
#else 
#define DLL_API __declspec(dllimport) 
#endif 

    DLL_API void __stdcall whatever(int a, int b); 

#ifdef __cplusplus 
} 
#endif 

#endif // EXAMPLE_H 

TEST.CPP

#include "test.h" 

__stdcall void whatever(int a, int b) { 
    std::cout << "whatever printout !!!" << std::endl; 
    int c = a + b; 
} 

私はコンパイラを使用するコマンド:

g++ -c -DEXPORT_DLL_FUNCT test.cpp -o test.o 

および

g++ -shared test.o -o libtest.dll -Wl,--out-implib=libtest.a 

ファイル "libtest.dll"と "libtest.a"が作成されます。なぜ両方必要ですか? VS2008プロジェクト(MSVC++)でライブラリを使用する場合は、両方のファイルが必要です.MinGWのサイトでこれを読んでいます。

次へ...私はVS2008 Win32コンソールアプリケーションプロジェクトを作成しました。このプロジェクトは、ライブラリから関数「何でも」を呼び出す予定です。

main.cppにVS2008で

#include "../mingw/test.h" 
#include <iostream> 


void main(void) 
{ 
    std::cout << "\n*** start ***" << std::endl; 

    whatever(3, 2); 

    std::cout << "\n*** end ***" << std::endl; 

} 

: "プロパティ - >リンカ - >一般 - >追加のライブラリディレクトリが" - >リンカー - 私は以前に作成したライブラリにし、「プロパティにパスを追加しました - >入力 - >追加の依存関係 "libtest.a"ファイルを追加しました。 私はプロジェクトをビルドするとき、comileとリンクはOKです、exeファイルは生成されますが、exeを実行しようとすると... segmentatinの不具合が発生します( "libtest.dll"は.exeファイルと同じフォルダにあります)! ! なぜ私は考えていない? "__stdcall"はコードで使用されているので、スタック上のものをプッシュする際に問題はありません。

何か提案してください。

答えて

0

私はこれのために良い説明を持っていないが、私はVSのコンパイル行に(デバッグシンボルを有効にするためのすべてのオプションを)/Zi/ZI、または/Z7を追加した場合、VS 2010で、アプリケーションが正しく実行され、関数を呼び出しますMinGWライブラリにあります。私は当初、VSのオプティマイザが問題を引き起こしていると暗示していたと考えましたが、/Odを指定してもセグメンテーション違反が防げませんでした。

1

ご回答ありがとうございます。あなたの提案は私を大いに助けました! 解決策を見てみよう... 部分的には私の非言語化であった...私は、デバッグモードのVS2008でbulidのいずれの場合でも.exeが動作するかどうかを単に忘れてしまった。答えはYESです。 :)デバッグモードでは、上の例がうまくいきます!しかし、まだリリースモードでは動作しません。 VS2008プロジェクトでは、リンカ - >最適化 - >参照をに設定します(/ OPT:NOREF)。それはすべてです...

0

GCCによって作成されたインポートライブラリは "アーカイブ"(.aまたは.lib for vc)の標準に適合し、アーカイブ内のオブジェクトファイルもCOFF標準に適合しましたが、 VCの方法と互換性がありません。

私はvc、implib sdk、およびgccによって作成されたインポートライブラリを調べ、gccとimplib sdkによって作成されたものはまったく同じものであることを発見しました。最も印象的な違いは、メンバ(アーカイブ内のオブジェクトファイル)の名前はimplib sdkのものと同じで、gccのものとは異なっている点です。 VCのリンカはgccのインポートライブラリとのリンクを拒否しませんが、不正なexeファイルが作成されます。

あなたはimplib sdkを見てみると、vcで動作するインポートライブラリを作ることができます。しかし、いくつかの制限は、DLLのファイル名の長さ、文字セットなどのように非常に厄介です。

vcのリンカーを使用してインポートライブラリを作成するのは良い方法です。作成されたインポートライブラリは、ソースコードと互換性があります。あなたの状況について、あなたは試してみることがあります。

  1. は、リンカーを有する

  2. メイクインポートライブラリlibtest.defとして保存この

    LIBRARY libtest 
    EXPORTS 
        [email protected] 
    

    などの.defファイルを書き込みます

    link /lib /out:libtest.lib /def:libtest.def 
    
  3. ここでlibtest.libを使用して、代わりに使用します。

関連する問題