Tôi muốn một số phần của dự án của tôi, rất hiếm khi được thay đổi, được biên dịch tĩnh và "cài đặt" trong thư mục riêng biệt. Nó là cần thiết vì do một số chi tiết cụ thể của dự án khá thường xuyên nó phải được biên dịch lại từ đầu (với việc loại bỏ toàn bộ thư mục xây dựng). "Cài đặt" các thư viện được liên kết tĩnh trong thư mục riêng biệt sẽ cho phép giảm đáng kể thời gian xây dựng.Làm thế nào để làm cho thư viện tĩnh được nhập khẩu phụ thuộc vào một thư viện được nhập tĩnh khác trong CMake?
Điều tôi đã có lúc đầu. Giả sử LibA được thay đổi rất ít và tôi muốn nó được cài đặt một lần và không được xây dựng lại trong hầu hết các dự án được xây dựng. LibA phụ thuộc vào thư viện LibC của một số bên thứ ba. Dự án cũng chứa LibB thay đổi thường xuyên và phụ thuộc vào LibA.
CMakeLists.tst (LibB):
target_link_libraries("LibB" LibA_build)
CMakeLists.tst (LibA):
add_library(LibA_build ...)
add_library(LibC STATIC IMPORTED)
add_dependencies(LibA_build LibC)
Trong trường hợp này trong liên kết LibB chúng ta sẽ phải phụ thuộc vào Liba và libc. Và mỗi lần trước khi xây dựng LibB, chúng tôi sẽ xây dựng lại LibA.
Để tránh xây dựng lại không cần thiết tôi đã thực hiện mục tiêu mới "Liba" (không phải "LibA_build). Vì thế bây giờ LibB phụ thuộc vào "Liba".
CMakeLists.tst (LibB):
target_link_libraries("LibB" LibA)
mục tiêu mới này tôi khai báo là thư viện nhập khẩu.
CMakeLists.tst (LibA):
# This target is for building and installing
add_library(LibA_build ...)
SET_TARGET_PROPERTIES(LibA_build PROPERTIES OUTPUT_NAME LibA)
install(
FILES /build/path/to/LibA.lib
DESTINATION /installed/path/to/LibA
)
# This target is for linking LibA with another libraries
add_library(LibA STATIC IMPORTED GLOBAL)
set_property(TARGET LibA PROPERTY IMPORTED_LOCATION /installed/path/to/LibA)
add_library(LibC STATIC IMPORTED)
add_dependencies(LibA LibC)
Kết quả:. bây giờ trước khi xây dựng LibB chúng ta không xây dựng lại Liba
vấn đề: thư viện vì bây giờ Liba trở thành nhập khẩu, CMake từ chối xem sự phụ thuộc của LibA trên LibC. Trong thực tế liên kết hướng dẫn cho LibB chỉ chứa phụ thuộc vào LibA, nhưng không có trên LibC. Trong trường hợp xây dựng trong Windows nó dẫn đến lỗi liên kết bên ngoài chưa được giải quyết.
Câu hỏi: Cách đặt thư viện tĩnh được nhập LibA phụ thuộc vào thư viện tĩnh được nhập LibC khác? Vì vậy, trong trường hợp liên kết lệnh LibB để liên kết sẽ chứa các phụ thuộc trên cả hai - LibA và LibC.
P.S. Tôi biết cách này không đúng cách. Tôi đã sử dụng nó chỉ vì tôi không tìm được cách nào khác. Tôi thực sự sẽ đánh giá cao nếu bạn giúp tôi thêm sự phụ thuộc vào thư viện nhập tĩnh hoặc đề xuất một cách khác làm thế nào để đạt được mục tiêu phong phú mà tôi đã mô tả ở phần bắt đầu.
Bạn có thể tạo mục tiêu tùy chỉnh "làm sạch" chỉ cho 'libA' hoặc bất kỳ phần cụ thể nào của dự án bị hỏng và yêu cầu xây dựng thường xuyên từ đầu. Hoặc bạn có thể sửa chữa nguyên nhân gốc rễ, có vẻ như thực tế là việc xây dựng lại phải được thực hiện ngay từ đầu. –
Vâng, tôi tin tưởng hơn "rm -rf *" hơn để làm sạch :) Dù sao, cảm ơn cho gợi ý. – Alex
Điểm của tôi là, bạn có thể viết một mục tiêu tùy chỉnh trong CMake chạy 'rm -rf' nếu bạn muốn. –