2009-06-09 4 views
8

C++プログラムでライブラリを使用する予定です。 Linuxでは開発が行われていますが、アプリケーションはLinuxとWindowsの両方でコンパイルされるように設計されています。私はWindowsの共有ライブラリ(.so)のための直接の等価物はDLLであると理解していますか?WindowsとLINUXでプログラムライブラリを作成する[C++]

g ++を使用するLinuxでは、-fPIC-sharedフラグを使用して共有ライブラリを作成できます。 AFAIKでは、共有ライブラリに必要なコード変更はありません。しかし、WindowsのDLLでは状況が異なります。そこでは、dllexportを使用してエクスポートする必要がある機能を指定する必要があります。

私はこの状況をどのように管理していますか?つまり、dllexportはLinuxでは無効です。コンパイラはエラーを起こします。しかし、それはWindowsで必要です。では、コードを変更せずに両方のプラットフォームでコンパイルする関数を作成するにはどうすればよいですか? LINUX

  • VC++ - - Windowsの
  • すべてのヘルプは素晴らしいことだ

    コンパイラは

    • グラム++を使用しました!

    答えて

    9

    私たちは、クラスの__declspec(dllexport)を指定:

    #define EXPORT_XX __declspec(dllexport) 
    
    class EXPORT_XX A 
    { 
    }; 
    

    あなたはその後、プラットフォームをチェックし、Windows上でのみマクロを定義することができます。例えば:

    #ifdef WIN32 
    #define EXPORT_XX __declspec(dllexport) 
    #else 
    #define EXPORT_XX 
    #endif 
    

    ダイナミックlibsのために行うにはより多くのものがあるかもしれないので、私たちは、主に静的ライブラリを構築するが、考え方は同じです - あなたは、Windowsのコードに挿入する必要がある文字列を定義するプリプロセッサマクロを使用します。

    +0

    ありがとうございました。ウィンドウで作成されたDLLの種類は何ですか?それはCOM dllですか? DLLの地獄の問題に遭遇する可能性はありますか? –

    +0

    dllexportを使用しても、dllはCOMシステムに公開されません。 dllの可能性は、dllとアプリケーションの配布方法に依存します。あなたのアプリケーションが必要とするdllを常にインストールするならば、このdllに関係する問題は問題ではありません。 –

    +0

    @sean e:ありがとう。私はいつもDLLのアプリケーションをアプリケーションディレクトリにインストールします。場合によっては、全体のアプリケーションではなく1つのDLLを置き換える小さな更新があるかもしれません。それは問題だろうか? –

    2

    #ifdefプリプロセッサーディレクティブを条件付きコンパイルに使用できます。たとえば:

    #ifdef WIN32 
        // Win32 specific code 
    #else 
        // Elsewhere 
    #endif 
    
    5

    もう1つの方法は、Windowsプロジェクトに.defファイルを使用することです。このファイルはDLLのエクスポートを指定しているので、コードベースを台無しにする必要はありません。 (ただし、余分なファイルを避けたい場合は、マクロを使うことをお勧めします)。

    +0

    .defファイルでC++シンボルを使用すると、かなり混乱することがあります。 –

    +0

    彼が何をしているかによって、ライブラリによって何らかのプラグインアーキテクチャを意味するならば、彼はCインタフェースでうまくいくので、.defファイルがうまくいくでしょう。 – diapir

    1

    もう1つのオプションは、WindowsでMinGWを使用することです。このようにしてWindowsでgccを使うことができます。そして、あなたはdeclspecナンセンスを心配する必要はありません。

    +1

    返信いただきありがとうございます。さて、これはオープンソースのアプリケーションであり、アプリケーションをうまくコンパイルするために幅広いコンパイラをサポートしたいと考えています。だから私はこれらのナンセンスがすべて必要だと思う。 –

    関連する問題