Mam następujące struktury projektu:CWprowadä - Zależności (nagłówki) między aplikacjami/bibliotek w samym projekcie
- CMakeLists.txt
- LIB1/CMakeLists.txt i wszystkie CPP a header pliki lib
- Lib2/CMakeLists.txt i wszystkie CPP a header pliki lib
- app/CMakeLists.txt i wszystkie CPP a header pliki aplikacji
Głównym CMakeLists.txt wygląda następująco:
PROJECT(${PROJECT_NAME})
add_subdirectory(lib1)
add_subdirectory(lib2)
add_subdirectory(app)
LIB1/CMakeLists.txt wygląda jak np (usuwane):
SET(SOURCE
file.cpp
)
SET(HEADERS
some_lib_header.h
)
add_library(lib1 ${SOURCE} ${HEADERS})
i jeden dla aplikacji wygląda tak samo z wyjątkiem z ADD_EXECUTABLE:
SET(SOURCE
main.cpp
)
SET(HEADERS
some_header.h
)
add_library(lib1 ${SOURCE} ${HEADERS})
ADD_EXECUTABLE(app ${SOURCE} ${HEADERS})
Znalazłem ustawienia działa dobrze w ten sposób, ponieważ z tego mogę generować jeden plik rozwiązania Visual Studio, który zawiera wszystkie te trzy projekty. Ale moim problemem jest to, że moja aplikacja zawiera pliki nagłówkowe lib1 (a także lib2, która zależy od lib1). Kiedy zrobić
$mkdir build
$cd build
$cmake -C ..\myproject
generuje out-of-źródła VS pliku .sln jak chcę go, ale aplikacja nie skompilować, ponieważ nie może znaleźć plików nagłówkowych z LIB1 (oczywiście).
Teraz czytam i wypróbowywuję wiele rzeczy, takich jak TARGET_LINK_LIBRARIES(app lib1)
(która dostała aplikację do połączenia z lib1, ale nie rozwiązuje problemu z nagłówkiem) i rzeczy takie jak add_subdirectory(../lib1)
w różnych wariantach w CMakeLists.txt aplikacji (która wszystkie rzucane błędy, których nie mogłem naprawić), a także find_package (co jest chyba błędnym podejściem).
Jak mogę rozwiązać ten problem (chyba prosty ...)?
Projekt jest dość duży, więc nie lubię jednego CMakeLists.txt. – Ela782
Twoje pierwsze proponowane rozwiązanie ma jeden problem: określasz projekt (...) na początku każdego pliku CMakeLists.txt dla biblioteki lib/app. Czy to nie jest zły styl i powinienem użyć projektu (...) tylko raz w głównym katalogu CMakeLists.txt? Ponadto, jeśli używam projektu (...) w każdym pliku CMakeLists.txt, CMake generuje plik .sln dla każdego projektu (oprócz root .sln ze wszystkimi projektami w nim) i inne niepotrzebne rzeczy, które są miłe kosztów ogólnych, które nigdy nie są używane i prawdopodobnie nie są najlepszym rozwiązaniem? – Ela782
@ Ela782 Tak - bez obaw. Wiele plików CMakeLists.txt może uprościć rzeczy całkiem niezależnie od wszystkiego, z wyjątkiem najmniejszych projektów. – Fraser