tôi có cấu trúc dự án sau:CMake - phụ thuộc (tiêu đề) giữa các ứng dụng/thư viện trong cùng một dự án
- CMakeLists.txt
- lib1/CMakeLists.txt và tất cả cpp và tiêu đề file của lib
- lib2/CMakeLists.txt và tất cả cpp và tiêu đề file của lib
- app/CMakeLists.txt và tất cả cpp và tiêu đề file của ứng dụng
Các CMakeLists.txt chính trông giống như:
PROJECT(${PROJECT_NAME})
add_subdirectory(lib1)
add_subdirectory(lib2)
add_subdirectory(app)
Các lib1/CMakeLists.txt trông ví dụ như (tước):
SET(SOURCE
file.cpp
)
SET(HEADERS
some_lib_header.h
)
add_library(lib1 ${SOURCE} ${HEADERS})
và một cho các ứng dụng trông giống nhau ngoại trừ của ADD_EXECUTABLE:
SET(SOURCE
main.cpp
)
SET(HEADERS
some_header.h
)
add_library(lib1 ${SOURCE} ${HEADERS})
ADD_EXECUTABLE(app ${SOURCE} ${HEADERS})
Tôi thấy thiết lập hoạt động tốt theo cách này vì tôi có thể tạo một tệp giải pháp Visual Studio chứa tất cả ba dự án đó. Nhưng vấn đề của tôi là ứng dụng của tôi bao gồm các tệp tiêu đề của lib1 (và cũng của lib2, phụ thuộc vào lib1). Khi tôi làm
$mkdir build
$cd build
$cmake -C ..\myproject
nó tạo out-of-nguồn VS file sln như tôi muốn nó, nhưng các ứng dụng không biên dịch bởi vì nó không thể tìm thấy các tập tin tiêu đề của lib1 (rõ ràng).
Bây giờ tôi đã đọc và thử nhiều thứ, như TARGET_LINK_LIBRARIES(app lib1)
(ứng dụng này có liên kết với lib1, nhưng không giải quyết vấn đề tiêu đề) và những thứ như add_subdirectory(../lib1)
trong các biến thể khác nhau trong CMakeLists.txt của ứng dụng (tất cả các lỗi được ném mà tôi không thể sửa), và cũng find_package (mà tôi đoán là cách tiếp cận sai).
Vậy làm thế nào tôi có thể giải quyết vấn đề này (tôi đoán đơn giản ...)?
Dự án khá lớn, vì vậy tôi không thích một CMakeLists.txt duy nhất. – Ela782
Giải pháp được đề xuất đầu tiên của bạn có một vấn đề: Bạn chỉ định một dự án (...) ở đầu mỗi tệp lib/app CMakeLists.txt. Đó không phải là phong cách xấu và tôi nên sử dụng dự án (...) chỉ một lần trong gốc CMakeLists.txt? Ngoài ra, nếu tôi sử dụng dự án (...) trong mỗi tệp CMakeLists.txt, CMake tạo tệp .sln cho từng dự án (ngoài phần gốc .sln với tất cả các dự án trong đó) và các công cụ không cần thiết khác, của chi phí không bao giờ được sử dụng và cũng có thể không phải là giải pháp tốt nhất? – Ela782
@ Ela782 Yeah - đừng lo. Nhiều tập tin CMakeLists.txt có thể đơn giản hóa mọi thứ khá tốt cho bất cứ thứ gì trừ các dự án nhỏ nhất. – Fraser