2

Linuxでのリンクについて次の質問があります。

Qtを使用するクラスFooがあるとします。このクラスを作成するには、qmakeを使用してMakefileを生成する必要があります。

後で、共有ライブラリであるPerlモジュールにこのクラスFooを使用したいと思います。ただし、それをビルドするには、PerlのMakeMakerを使用して独自のMakefileを生成する必要があります。

私が今やっている方法は、クラスFooを静的ライブラリとしてビルドし、Perlモジュールの共有ライブラリをビルドするときに、Fooの静的ライブラリに対してリンクしていることです。

問題は、Perlモジュールの共有ライブラリを構築するときに、Fooの静的ライブラリがリンクされているすべてのQtライブラリに対してリンクする必要があることです。

したがって、問題は次のとおりです。

  1. このアプローチは意味がありますか?!

  2. Perlモジュールの共有ライブラリを構築するときにすべての依存関係を指定する必要がない方法でFooの静的ライブラリを構築することは可能ですか?(これらすべての依存関係をモジュールのMakefileに追加するのはやや難しいため)

  3. Fooのライブラリが静的ではなく共有されている場合、それは何か違いがありますか?

4

2 に答える 2

2

1) 共有ライブラリに対して静的ライブラリをリンクすることはできません。

2)それ自体が DSO であるFoo場合、 の依存関係に対して明示的にリンクする必要はありません。Foo

3) Makefile.PL セクションを簡単に変更して、LIBSリンカの依存関係を追加できます。

4) Qt はとにかく静的にリンクするのが実に苦痛です。特定のバージョンの依存関係や OS/プラットフォームの制限がない限り、動的シェバン全体を実行する方がよいでしょう。ヒント: Qt の「静的」ビルドがある場合でも、この「静的」ビルドには、ロード可能なモジュールとして存在する必要があると判断されるものは含まれません。行ったことがある。

5) Qt4 バインディングを提供する CPAN モジュール (やや最近) があると思います。使ったことがないので状態はわかりませんが、参考にしてみてください。

しかし、あなたの最善の策はFoo、動的ライブラリを作成することです..そうすれば、誰もが幸せになります.

于 2012-09-19T04:09:34.853 に答える
1

1) 目的によって異なります。

2) ビルドの手間を最小限に抑えることが目的の場合は、Qt の静的ライブラリを Foo ライブラリに静的として含めることができます。重要なのは、Foo で参照するシンボルが実行時に見つかることだけです。そうすれば、PerlMake に Qt ライブラリを含める必要がなくなります。

3) 実行可能ファイルのサイズを最小化する場合は、共有ライブラリを使用する必要があります。次に、すべてを共有ライブラリとして構築する必要があります。

静的にビルドすると、ターゲット プラットフォームにインストールされている共有ライブラリから独立しているという利点がありますが、実行可能ファイルのサイズが肥大化し、ライブラリを再利用できないという欠点があります (2 つの同じ実行可能ファイルをロードするには、より多くのメモリが必要です)。

共有に対するリンクには、コード サイズが小さくなるという利点がありますが、同時に、適切な共有ライブラリをターゲット プラットフォームにインストールする必要があります。

于 2012-09-18T19:09:03.717 に答える