24

私はcmakeに問題があります。たとえば、CMakeLists2 があるサブディレクトリを持つ CMakeLists1 があります。

CMakeLists2 では、私のターゲットは静的ライブラリです。そして、それを外部ライブラリにリンクしたい。私はそれをちょうどそのようにしました:

link_directories ("path_to_library")
add_library (project2 ${sources})
target_link_libraries (project2 "name_of_external_lib")

次に、この project2 のクラスを project1 で使用したいと考えています。私はそのようにしました:

add_executable (project1 ${sources})
target_link_libraries (project1 project2)

しかし、それはまったく機能しません。まず、project2 は外部ライブラリにリンクしていませんでした。確認のため、vs10 プロジェクトのプロパティからこのライブラリを追加しましたが、サイズが異なっていました。そして 2 番目に、何らかの形で project1 がその外部ライブラリ (このプロジェクトのライブラリ依存関係にあります) を認識し、もちろんそれを見つけることができません。

何が問題ですか?

4

2 に答える 2

11

project2 を外部ライブラリにリンクするのではなく、両方のライブラリを実行可能ファイルにリンクするのが CMake のデフォルトの動作だと思います。本「Mastering CMake」より。

静的ライブラリは依存するライブラリにリンクしないため、CMake がライブラリを追跡して、作成される実行可能ファイルのリンク行で指定できるようにすることが重要です。

CMakeLists2 で絶対パスを使用してみることができます。

add_library (project2 ${sources})
target_link_libraries (project2 "path to ext lib"/"name of ext lib")

または追加できます

link_directories ("path_to_library")

project1のCMakeListsファイルに。

本当に Visual Studio のようなことをしたい場合は、おそらくこの回答で指定されたコマンドを使用して、CMake で custom_command を構築できます。おそらくこのようになります(私はテストしませんでした)。

set(EXT_LIB "path_to_library/name_of_external_lib") 
set(BIG_LIB "path_to_big_lib/name_of_big_lib")
add_library (project2 ${sources})
get_property(PROJ2_LOC TARGET project2 PROPERTY LOCATION)

add_custom_command(OUTPUT ${BIG_LIB} 
                   DEPENDS ${EXT_LIB} project2
                   COMMAND "lib.exe /OUT:${BIG_LIB} ${EXT_LIB} ${PROJ2_LOC} )

次に、実行可能ファイルを${BIG_LIB}にリンクできます。

あなたが考慮しなければならないいくつかのこと:

  • LOCATION_CONFIGを使用する必要があるかもしれません( CMake docsこの回答で get_property コマンドを見つけました)
  • link.exe がパスにある必要があります
  • 他の CMakeLists.txt で使用する場合は、 BIG_LIB変数のスコープに注意してください。
于 2013-01-23T13:03:28.013 に答える
4

問題はおそらく *name_of_external_lib* が正しくないため見つからないことだと思います。

私は一緒に行きます:

find_library(
    LIB_I_NEED name_of_external_lib
    HINTS "path_to_library"
)

if(${LIB_I_NEED} STREQUAL "LIB_I_NEED-NOTFOUND")
    message(FATAL_ERROR "Couldn't find the 'external_lib' library)
endif()

message(STATUS "Found 'external_lib' at: ${LIB_I_NEED}")

add_library (project2 ${sources})
target_link_libraries (project2 ${LIB_I_NEED})

それでも問題が解決しない場合は、cmake ドキュメントの例を簡単に読んでください。

http://www.cmake.org/cmake/help/v2.8.8/cmake.html#command:target_link_libraries

そこに言及されていることの1つは次のとおりです。

通常は 1 回の繰り返しで十分ですが、パソロジカル オブジェクト ファイルとシンボルの配置にはさらに多くのことが必要になる場合があります。最後の target_link_libraries 呼び出しでコンポーネントを手動で繰り返すことで、このようなケースを処理できます。

したがって、他に試してみるべきことは、project2 にある可能性があります。

set(PROJECT_2_LIBS project2 "name_of_external_lib" PARENT_SCOPE)

次に、exeで:

target_link_libraries (project1 ${PROJECT_2_LIBS})

これにより、「external_lib」リンケージが 2 つの場所で繰り返され、機能する可能性が高くなります;)

于 2013-01-22T22:28:38.653 に答える