21

次のプロジェクト構造があります。

  • CMakeLists.txt
    • lib1/CMakeLists.txt および lib のすべての cpp およびヘッダー ファイル
    • lib2/CMakeLists.txt および lib のすべての cpp およびヘッダー ファイル
    • app/CMakeLists.txt およびアプリのすべての cpp ファイルとヘッダー ファイル

メインの CMakeLists.txt は次のようになります。

PROJECT( ${PROJECT_NAME} )
add_subdirectory(lib1)
add_subdirectory(lib2)
add_subdirectory(app)

lib1/CMakeLists.txt は、たとえば次のようになります (削除されます):

SET(SOURCE
file.cpp
)
SET(HEADERS
    some_lib_header.h
)
add_library( lib1 ${SOURCE} ${HEADERS} )

アプリ用のものは、ADD_EXECUTABLE を除いて同じように見えます。

SET(SOURCE
main.cpp
)
SET(HEADERS
    some_header.h
)
add_library( lib1 ${SOURCE} ${HEADERS} )
ADD_EXECUTABLE( app ${SOURCE} ${HEADERS} )

これにより、これら 3 つのプロジェクトすべてを含む 1 つの Visual Studio ソリューション ファイルを生成できるため、この方法でセットアップがうまく機能することがわかりました。しかし、私の問題は、アプリに lib1 (および lib1 に依存する lib2) のヘッダー ファイルが含まれていることです。私がする時

$mkdir build
$cd build
$cmake -C ..\myproject

必要に応じてソース外のVS .slnファイルを生成しますが、lib1のヘッダーファイルが見つからないため、アプリはコンパイルされません(明らかに)。

今、私は多くのことを読んで試しTARGET_LINK_LIBRARIES( app lib1 )ましたadd_subdirectory( ../lib1 ). 't fix)、および find_package (これは間違ったアプローチだと思います)。

では、どうすればこの問題を解決できますか (単純だと思います...)。

4

2 に答える 2

25

考えられる解決策の 1 つを次に示します。

ルート CMakeLists.txt:

cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
project(${PROJECT_NAME})
add_subdirectory(lib1)
add_subdirectory(lib2)
add_subdirectory(app)


lib1/CMakeLists.txt:

project(Lib1)
add_library(lib1 lib1.cpp lib1.h)


lib2/CMakeLists.txt:

project(Lib2)
add_library(lib2 lib2.cpp lib2.h)

# Add /lib1 to #include search path
include_directories(${Lib1_SOURCE_DIR})
# Specify lib2's dependency on lib1
target_link_libraries(lib2 lib1)


アプリ/CMakeLists.txt:

project(App)
add_executable(app main.cpp some_header.h)

# Add /lib1 and /lib2 to #include search path
include_directories(${Lib1_SOURCE_DIR} ${Lib2_SOURCE_DIR})
# Specify app's dependency on lib2.
# lib2's dependency on lib1 is automatically added.
target_link_libraries(app lib2)


ここで同じ最終結果を得るには、さまざまな方法があります。比較的小規模なプロジェクトの場合、おそらく CMakeLists.txt を 1 つだけ使用します。

cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
project(Test)

add_library(lib1 lib1/lib1.cpp lib1/lib1.h)
add_library(lib2 lib2/lib2.cpp lib2/lib2.h)
add_executable(app app/main.cpp app/some_header.h)

include_directories(${CMAKE_SOURCE_DIR}/lib1 ${CMAKE_SOURCE_DIR}/lib2)

target_link_libraries(lib2 lib1)
target_link_libraries(app lib2)


関連するコマンドとその根拠の詳細については、次を実行してください。

cmake --help-command add_subdirectory
cmake --help-command include_directories
cmake --help-command target_link_libraries
于 2012-06-26T22:47:18.507 に答える