0

現在、CMake を使用して C++ プロジェクトを構築しています。CMake は、プロジェクトに不要なライブラリ依存関係を導入することがわかりました。例を挙げると、私のプロジェクトは 1)lib1 2)lib2 3)lib3 と 4)app の 4 つの部分で構成されています。

------lib1---
        |----
      lib2---
        |----
      lib3---
        |----
      app---

のソース コードはapp、 で作成された動的ライブラリに依存するプログラムを構築しlib3ます。lib3ただし、などで作成された動的ライブラリに依存していlib2ます。VC10 プロジェクトをビルドするために、次の CMake スクリプトをビルドします 。1) ルート CMakeLists:

   cmake_minimum_required( VERSION 2.6 )

    project (test)


    add_subdirectory(lib1)

    add_subdirectory(lib2)

    add_subdirectory(lib3)

    add_subdirectory(app)

2) lib1 CMakeLists.txt

add_definitions (-DEXP_STL )
add_library(lib1 SHARED lib1.cxx)

3) lib3 CMakeLists.txt

add_definitions (-DEXP_STL )
add_library(lib3 SHARED lib3.cxx)
target_link_libraries(lib3 lib2)

4) アプリ CMakeLists.txt

add_executable(app main.cpp)
target_link_libraries(app lib3)

これらの CMake スクリプトがあれば、VC10 プロジェクトのビルドに問題はありません。ただし、CMake が VC10 のライブラリ間に不要なライブラリ依存関係を導入することに気付きました。たとえば、appアプリケーション プログラムの場合、1 つのライブラリ、つまり lib3. ただし、VC10 プロジェクトでは、次の追加の依存関係が追加されていることに気付きました。

..\lib3\Debug\lib3.lib
..\lib2\Debug\lib2.lib
..\lib1\Debug\lib1.lib

ただし、CMake スクリプトでは、lib3依存関係のみが導入されることになっています。この例のプロジェクトでは問題にならないかもしれませんが、導入された冗長ライブラリが適切な検索パスを要求するため、コンパイル エラーが発生する可能性があります。したがって、これらの不要なライブラリを削除する方法があるかどうか疑問に思っています。ありがとう!

4

2 に答える 2

1

CMake は依存ライブラリを推移的に追加します。これは、プロパティ LINK_INTERFACE_LIBRARIES を空の文字列に設定することでオフにすることができます。SET_TARGET_PROPERTIES(lib3 PROPERTIES LINK_INTERFACE_LIBRARIES "") を実行すると、アプリをリンクするときに、CMake はアプリから lib1 および lib2 への依存関係を生成しません。

于 2012-09-13T07:49:36.433 に答える
0

静的なライブラリを作成していた場合、CMake が不要な依存関係を引き込んでいたことに同意します。ただし、動的ライブラリを構築しているため、CMake がここに不要な依存関係を追加しているとは思いません。動的ライブラリのチェーンがあります。この場合、 をリンクするlib3と、リンカーも をプルする必要があります。これにより、アプリケーションをリンクするためのすべてのシンボル依存関係を満たすためにlib2、リンカーがプルすることになります。lib1

于 2012-09-12T14:55:50.450 に答える