2011-10-19 10 views
9

私はcmake(GNU makeとg ++でLinux)を使って、2つのサブディレクトリMyLibとMyAppを持つプロジェクトを構築しようとしています。 MyLibには静的ライブラリのソースが含まれています。 MyAppはそのライブラリとリンクする必要があります。私は次のCMakeLists.txtを使って生成されたmakefileを使ってLinuxを構築しようとしています:CMAKE:ビルドライブラリとそのリンク

これはほとんど「うまくいく」です。リンク時に失敗するのは、libMyLibrary.aを生成している間です。これはルートにあります。私が追加するとき:

link_directories(${MyProj_BINARY_DIR}) 

それは違いがありません。

  1. 私のライブラリを構築するにcmakeのを強要し、「ステージングディレクトリ」—は、ターゲットが分離しておくためにMyStage —言うに実行ファイルへの最善の方法は何ですか:

    私はいくつかの(インターリンク)の質問を持っていますソースから?

  2. cmakeがアプリケーションをライブラリにリンクさせるにはどうすればよいですか?
  3. 私がcmakeスクリプトを拡張して、—をデバッグアプリケーションとリリースライブラリとの間で確実にリンクするようにするにはどうすればよいですか?

私はcmakeに相対的に新人です。私はウェブで見つけたものを読んだことがありますが、自分のライブラリを自分の実行ファイルにリンクさせるのに苦労しています。この種の構成は、私の心にはかなり共通しているはずです。ベビーベッドの例はとても役に立ちますが、見つけられませんでした。

答えて

3
  1. 「アウトソースビルド」を使用してください。のみのビルドにし、その中にいる間に使用されるディレクトリを作成し、

    cmake <path to the sources, it may be relative>
  2. を呼び出すどちらの

    link_directories(${MyProj_BINARY_DIR}/MyLib)

    を使用するか、各サブディレクトリにCMakeLists.txtを作る - 非常に小さいより大きいプロジェクトのために良いだろうという。

  3. これはややこしいことですが、ドキュメントのCMAKE_BUILD_TYPEをチェックしてください(あなたはそれを設定することができます)。あなたはまた、コマンドラインから設定することができます:私は、(1)の '最適な' ソリューションを発見した

    cmake -DCMAKE_BUILD_TYPE=Debug
+0

を作成している私は、(1)仕事ができる方法を見ることができます - 私はそれがきちんとしないと思うけれども。私はそれを助けることができれば、私のライブラリーと一緒に私の 'ステージングディレクトリ'にCMakeLists.txtを置いて欲しくない。 – aSteve

+0

Uhm、いいえ、いいえ、CMakeLists.txtはソースツリーに残ります。 cmakeへの引数として渡されるパスは、トップレベルのCMakeLists.txtを含むディレクトリです。この設定では、 "ステージング"ディレクトリはcmake呼び出しの前に完全に空です。 – kralyk

3

...ので、私はここにそれを投稿する必要があり考えた:

SET(CMAKE_ARCHIVE_OUTPUT_DIRECTORY MyStage) 
SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY MyStage) 

これまで私が混乱していたことは、静的ライブラリがCmakeによってライブラリと見なされないということです。それらはアーカイブであると考えられています。

+0

私が見つけた唯一の有用な答え!そこに名前はとても混乱しています! – rationalcoder

15

よく、exampleを読んで、正確に示唆していることを行うことをお勧めします。

cmake_minimum_required (VERSION 2.6) 
project (MyProj CXX) 
add_subdirectory(MyLib) 
add_subdirectory(MyApp) 

次に、指定されたサブディレクトリごとに、CMakeLists。TXTファイルは

MYLIB \ CMakeLists.txt

file(GLOB SRC_FILES *.cpp) 
add_library(MyLib ${SRC_FILES}) 

のMyApp \ CMakeLists.txt

file(GLOB SRC_FILES *.cpp) 
add_executable(MyApp ${SRC_FILES}) 
target_link_libraries(MyApp MyLib)