2009-08-05 13 views
25

私はクロスプラットフォームコードの作成にいくつかの助けが必要です。アプリケーションではなくライブラリです。C++クロスプラットフォームの動的ライブラリ。 LinuxとWindows

私は、Linuxで行われたほとんどの開発でスタティックとダイナミックの両方のライブラリを作成していますが、スタティックでダイナミックなライブラリのWindows版を生成したいと思っています.lib.dllの同じソースコードを使用しています。

これは可能ですか?私はWindows .dllを生成するのに気付いたので、少し気になりました。_dllspecなどのソースコードに類似したファイルが必要です。

私のコードをWindows上でコンパイルするには、誰も助けてくれないでしょうか。私はLinux上でコンパイルする必要はありません。私はWindows上で直接それをやってうれしいです。また私は2つの外部ライブラリを使用しています。これはboostとXerces XMLです。WindowsとLinuxの両方のシステムにインストールしていますので、うまくいけば問題ではありません。

私が本当に望むのは、LinuxとWindowsの両方でコンパイルできる単一のソースコードのコピーを各プラットフォーム固有のライブラリを生成することです。私は、ソースコードのコピーを1つしか持てない限り、WindowsやLinuxのコードを編集しなければならないかどうかは気にしません。一般的に

+0

クロスコンパイルは、通常、あるプラットフォームで別のプラットフォームで実行するソフトウェアを構築することを指します。 LinuxとWindowsの両方でコンパイルできるソースコードがほしいと言っているので、クロスコンパイルよりもポータブルなクロスプラットフォームのソースコードベースを書くことが本当に重要です。 –

+0

GIYF実際、この場合、libtoolはあなたの友人です... –

+0

答えを待つ間に、CMakeをチェックしてください:http://www.cmake.org/ – Pete

答えて

18

、あなたが心配する必要は二つの問題があります。

  1. は、Windows上で、あなたのDLLを明示的に__declspec(dllexport)を経由して(外の世界に見えるはずのシンボルをエクスポートし、そして
  2. 、要件最初の場合
  3. (理想的には、別のメイクファイルおよびMicrosoft Visual C++プロジェクト/ソリューションを維持する必要がない)ビルドシステムを維持することができること

、あなたはおよそ__declspec(dllexport)を学習する必要があります。オンWindowsのみのプロジェクトですが、これは通常、私が答えたところでthis questionに記述されています。エクスポートシンボル(MY_PROJECT_APIなど)が定義されていることを確認し、Linux用にビルドするときは何も展開しないようにすることで、これをさらに進めることができます。このようにして、Linuxビルドに影響を与えることなく、Windowsの必要に応じてエクスポートシンボルをコードに追加することができます。

第2に、クロスプラットフォームビルドシステムのいくつかを調べることができます。

GNUツールセットに慣れている場合は、おそらくlibtool(automakeとautoconfと組み合わせて)を調べることをお勧めします。 ツールはLinuxでネイティブにサポートされており、WindowsではCygwinまたはMinGW/MSYSのいずれかを使用してサポートされています。 MinGWは、クロスコンパイルのオプションも提供します。つまり、Linuxを実行している間にネイティブのWindowsバイナリを構築することができます。 Autotools(libtoolを含む)をナビゲートする際に役立つ2つのリソースは、"Autobook"(具体的にはDLLs and Libtoolのセクション)とAlexandre Duret-Lutz's PowerPoint slidesです。

他にも言及したように、CMakeもオプションですが、私はそれを自分で話すことはできません。

+0

ありがとう、私はいくつかのGoogleの検索を行い、私は間違ったものを検索したと思う、libtoolは、上記の誰かとして興味深いとおそらくcmakeを聞かせます。私はLinuxにはまったく新しいものなので、このツールはすぐに鐘を鳴らさないようにしています:p –

9

あなたは#ifdefで簡単にそれを行うことができます。 Windowsでは_WIN32はコンパイラによって(たとえ64ビットであっても)定義する必要がありますので、

#ifdef _WIN32 
# define EXPORTIT __declspec(dllexport) 
#else 
# define EXPORTIT 
#endif 

EXPORTIT int somefunction(); 

のようなコードは問題なく動作します。

+0

えええええええええええええええええええええええええええええええええ、 –

+0

@iQ:上記のツールを使っても、これをやる必要があります。彼らはあなたのためにエクスポートを処理しない、彼らはちょうど異なるプラットフォームでのビルドプロセスの違いのいくつかを隠す。 –

+0

ええ、私はあなたの権利を推測します。私はマクロを使用する必要があります。私は現在、どのように良いか悪いか分からないが、あなたが自動的に.defファイルを定義できると思うコードブロックを見ようとしている。私はちょっと実験しなければならないだろう。 –

7

多分それあなたがにextern "C" を追加した場合、より良いです!!!、

/*ファイルCMakeLists.txt */

SET (LIB_TYPE SHARED) 

ADD_LIBRARY(MyLibrary ${LIB_TYPE} MyLibrary.h) 

/*ファイルMyLibrary.h */

#if defined(_WIN32) || defined(__WIN32__) 

    #if defined(MyLibrary_EXPORTS) // add by CMake 

    #define MYLIB_EXPORT extern "C" __declspec(dllexport) 
    #else 

    #define MYLIB_EXPORT extern "C" __declspec(dllimport) 

    #endif /* MyLibrary_EXPORTS */ 

#elif defined(linux) || defined(__linux) 

#define MYLIB_EXPORT 

#endif 


MYLIB_EXPORT inline int Function(int a) 

{ 
    return a ; 
} 
+1

神の愛のために、より良いフォーマットを使用してください! – tstenner

+0

@tstennerあなたは、自分のコードを入力しているときに、人々が自分の書式スタイルをオンザフライで作成しているときに、絶対に愛するだけではないと言っていますか? :) –

+0

@tstennerは合意しました..この "フォーマット"それも..どのように私は言うことができます.. –

関連する問題