2

私は一種のミニプロジェクトとして CMake を使用して TinyXML をコンパイルしようとしており、CMake を学ぼうとしています。さらに、動的ライブラリにコンパイルし、それ自体をインストールして動作するようにしようとしています。

これまでのところ、コンパイルしてインストールすることができましたが、.dll と .dll.a にコンパイルされます。動作させる唯一の方法は、/bin と /lib の両方にインストールすることです。両方のファイルを両方のフォルダーにインストールします。このセットアップは機能しますが、.dll は /bin に、.dll.a は /lib にあるはずです。これは Cygwin 固有の問題ですか、それとも何か間違っていますか?

4

2 に答える 2

3

.dll はランタイム ライブラリ ファイルであり、実行時にターゲット システムに存在する必要があります (そして、その $PATH に存在する必要があります)。.dll.a ファイルは .dll のインポート ライブラリであり、リンク時にコンパイル マシン上に存在する必要があります。.dll ファイルをプログラムを実行する場所に配布し、.dll と .dll.a の両方をライブラリを使用して他のプログラムをリンクする場所に配布する必要があります。プログラムのみを実行しているマシンでは、.dll.a ファイルは必要ありません。

共有ライブラリを作成したくない場合は、add_library コマンドでstatic キーワードを使用して cmake に指示できます。

add_library(mylib STATIC foo.c bar.cpp)

この方法では、共有ライブラリは作成されませんが、ライブラリのコードはリンカーによって最終的な実行可能ファイルに追加されます。

于 2010-09-22T07:22:01.717 に答える
1

必要なのは、ファイルの種類ごとに宛先を指定することです。

.dll は RUNTIME ライブラリと見なされ、.a は ARCHIVE です。念のため、他のプラットフォームの場合は、おそらく LIBRARY エントリ (.so ファイル用) が必要です。

install( TARGETS ${PROJECT_NAME}
  LIBRARY DESTINATION lib
  ARCHIVE DESTINATION lib
  RUNTIME DESTINATION bin
)
于 2015-03-24T08:43:34.220 に答える