Po obejrzeniu kilku kursów na YT (Pfeifera, Scotta oraz Bahadira) i po przeczytaniu kilku tutoriali. Chciałem stworzyć nastęujący bardzo prosty projekt, składający się z apki oraz wydzielonych plików na bibliotekę współdzieloną. Ogólnie to drzewo katalogów wygląda u mnie tak:
kkk/
├── app/
│ ├── CMakeLists.txt
│ └── src/
│ └── main.cpp
├── library/
│ └── foo/
│ ├── CMakeLists.txt
│ ├── include/
│ │ ├── FooTest_global.hpp
│ │ └── FooTest.hpp
│ └── src/
│ └── FooTest.cpp
└── CMakeLists.txt
Pliki CMakeowe wyglądają następująco:
kkk/CMakeLists.txt (główny)
cmake_minimum_required(VERSION 3.11)
project(Super-App
VERSION 1.0.0
)
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
add_subdirectory(library)
add_subdirectory(app)
kkk/library/foo/CMakeLists.txt
cmake_minimum_required(VERSION 3.11)
project(Foo-Library
VERSION 1.0.0
)
add_library(Foo SHARED)
target_compile_definitions(Foo PRIVATE FOO_LIBRARY)
target_sources(Foo
PRIVATE "src/FooTest.cpp"
PRIVATE "include/FooTest_global.hpp"
PUBLIC "include/FooTest.hpp"
)
kkk/app/CMakeLists.txt
cmake_minimum_required(VERSION 3.11)
project(FooBar-App
VERSION 1.0.0
)
add_executable(Bar)
target_sources(Bar
PRIVATE "src/main.cpp"
)
target_link_libraries(Bar
PRIVATE Foo
)
Teraz chodzi o to, że jeśli w pliku kkk/CMakeLists.txt zakomentuje linijkę add_subdirectory(app), wykonam polecenie cmake -S kkk/ -B build/
, a później w tym katalogu make
, to powstanie oczekiwany plik biblioteki.
Ale jeśli pozostawię ją odkomentowaną, to przy wykonywaniu polecenia cmake -S kkk/ -B build/
pokazuje się komunikat (fragment - żeby nie przedłużać):
CMake Warning (dev) at library/foo/CMakeLists.txt:11 (target_sources):
Policy CMP0076 is not set: target_sources() command converts relative paths
to absolute. Run "cmake --help-policy CMP0076" for policy details. Use
the cmake_policy command to set the policy and suppress this warning.
An interface source of target "Foo" has a relative path.
This warning is for project developers. Use -Wno-dev to suppress it.
-- Configuring done
CMake Error at app/CMakeLists.txt:6 (add_executable):
Cannot find source file:
include/FooTest.hpp
Plik include/FooTest.hpp oczywiście jest co widać po drzewie katalogów.
Co jeszcze dopisać i gdzie żeby to zadziałało?
Dodam jeszcze, że chcę żeby był to taki najprostszy szkielet do dalszej pracy i następnych projektów bez plików konfiguracyjnych, które same zwiększają nr przebudowania projektu itp. Kiedyś znalazłem taki tutorial gdzie to działało ale teraz nie mogę go już odnaleźć.
Używam minimalnej wersji CMake: VERSION 3.11 bo wykorzystuję uproszczoną składnię add_library
i add_executable
(bez plików źródłowych, które dodaję później poprzez polecenia target_sources
), natomiast mam zainstalowaną wersję 3.16.3.