2009-05-29 5 views
4

私は50ヶ月のヘッダー/ソースファイルをインポートするのではなく、ライブラリーとリンクとしてビルドしたいと思っています。C++ソースコードをライブラリとしてビルドする - どこから起動するのですか?

プロジェクトはXcodeとDev-C++で管理されています(私が望むようにコマンドラインに行かなければならないかもしれないことを理解しています)、OpenGLとSDL(SDLの場合は動的)にリンクする必要があります。ターゲットプラットフォームはWindowsとOS Xです。

私は全く何を見ていますか?それが1つを必要とする場合、私の ライブラリのエントリポイントになります何

  • コードで変更する必要があるのは何ですか? (通話の規約は?)
  • どのようにして解放するのですか?私の理解で は(それができるでしょう何の.dll、は.dylib(、.framework)、 )ヘッダとコンパイル ライブラリがプロジェクトのために利用可能 する必要があることである - テンプレート機能 がに含めることはできません、特にとして、ライブラリによって 自然。
  • 他に知りたいことがありますか?
+1

.libとしてビルドすると考えましたか?これは、あなたのアプリケーションがヘッダーファイルにアクセスする必要があるが、ソースファイルにはアクセスする必要がないことを意味します。 DLLルートと比較して変更が少ないことを意味します。 – Kieveli

答えて

11

私はstatcライブラリーではなく、DLLとして構築お勧めします。ライブラリをビルドしたのと同じコンパイラで生成されたコードとリンクするつもりであれば、C++の関数とクラスをエクスポートすることの多くの問題が解消されます。

静的ライブラリを構築することは、zipファイルのように少し圧縮したものの、.o/.objファイルのコレクションなので非常に簡単です。何もエクスポートする必要はありません。アプリケーションがリンクするファイルのリストにライブラリを含めるだけです。特定の関数またはクラスにアクセスするには、関連するヘッダファイルをインクルードするだけです。ヘッダーファイルを取り除くことはできません.C++のコンパイルモデル、特にテンプレートの場合は、それらに依存します。

2

ダイナミックライブラリからC++クラスライブラリをエクスポートすることは問題になりますが、可能です。
DLLからエクスポートする各関数をマークする必要があります(構文はコンパイラによって異なります)。私はxcodeからこれを行う方法を見つけることができるかどうかを調べるために取り組んでいます。 VCでは__declspec(dllexport)、CodeWarriorでは#pragma export/#pragma exportを行います。

社内でバイナリのみを使用している場合は、これは完全に合理的です。しかし、1つの問題は、C++メソッドの名前が異なるコンパイラによって異なることです。これは、Cコンパイラをエクスポートするだけでない限り、別のコンパイラを使用する人は誰もあなたのDLLを使用できないことを意味します。

また、DLLとDLLのクライアントで呼び出し規約が一致していることを確認する必要があります。これは、どちらも同じであることを意味するデフォルト呼び出し規約は、DLLまたはクライアントの両方に対してコンパイラに渡されるか、DLLの各エクスポートされた関数で明示的に呼び出し規約を設定するので、デフォルトはクライアント用です。

この記事では、ネーミングの問題について説明します。 http://en.wikipedia.org/wiki/Name_decoration

+0

Dev-C++はVCの(?)構文を使用していますが、xcodeは#pragma GCC可視性プッシュ(隠し)と#pragma GCC可視性プッシュ(デフォルト)を使用してシンボルの可視性を制御しているようです。 – zyndor

1

C++標準では標準ABIは定義されていません。これはC++ライブラリをビルドしようとする人にとっては悪いニュースです。これは、コンパイルされたコードとコンパイルされたコードによって異なる動作をし、コンパイルに使用されたフラグによって異なる動作をすることを意味します。コンパイルしてうまくリンクする不思議なバグにつながる可能性があります。

C++コードは、RTTI、例外処理、およびC++コードが依存するクラスインスタンスのメモリレイアウトに影響を与えるさまざまな最適化をサポートするようにコンパイルすることができます。

あなたは何をすればよいですか?ソースツリー内にC++ライブラリを構築し、プロジェクトのビルドの一部としてビルドされていることを確認し、すべてのライブラリとそれらにリンクするコードが同じコンパイラフラグを使用するようにします。

少なくとも、異なるコンパイラ/コンパイラフラグでコンパイルされたオブジェクトファイルをリンクするのを妨げることになっていたネームマングリングは、ほとんどの場合動作しますが、特にGCCでは可能なことがあります実行時にうまくリンクして失敗するようなコードです。

ベンダ提供のダイナミックC++ライブラリ(たとえば、ほとんどのLinuxディストリビューションではQT)には細心の注意を払う必要があります。ベンダー提供ライブラリのインスタンスが正しく動作しないようにコンパイルされています。たとえば、RedHat Linuxの一部のリリース(多分それらのすべて)がQTで例外を無効にしていたため、QTコールバックで例外がスローされた場合、main()の例外を捕捉することは不可能でした。楽しい。

+0

他のすべてのコンピュータ言語でも同じことが当てはまります。私はABIを標準化する標準化された言語は認識していません。 –

+1

いつもJavaはありますが、それはデファクトスタンダードにすぎませんので、ここでは言及しません。 –

+0

いいえ、Javaは私のブランケットステートメントのgpod counter-exampleかもしれません。私はそれがABIを持っていると言うことができるかどうかはわかりません。 –

関連する問題