У меня есть следующая структура проекта:
- CMakeLists.txt
- lib1/CMakeLists.txt и все файлы cpp и заголовков lib
- lib2/CMakeLists.txt и все файлы cpp и заголовков lib
- 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} )
Я нашел, что настройка работает хорошо, потому что из этого я могу создать один файл решения Visual Studio, содержащий все эти три проекта. Но моя проблема в том, что мое приложение включает в себя файлы заголовков lib1 (а также lib2, который зависит от lib1). Когда я делаю
$mkdir build
$cd build
$cmake -C ..\myproject
он генерирует файл VS.sln вне источника, как я этого хочу, но приложение не компилируется, потому что оно не может найти файлы заголовков lib1 (очевидно).
Теперь я читал и пробовал много вещей, например TARGET_LINK_LIBRARIES( app lib1 )
(который получил приложение для связи с lib1, но не решил проблему с заголовком), и такие вещи, как add_subdirectory( ../lib1 )
в различных вариантах в CMakeLists.txt из приложение (которое все забросило ошибки, которые я не смог исправить), а также find_package (что, я думаю, неверный подход).
Итак, как я могу решить эту проблему (я думаю, простая...)?