2015-01-22 23 views
5

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.

+0

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. –

+0

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

+0

Đ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. –

Trả lời

3

Tính năng mà tôi đang tìm kiếm (thêm phụ thuộc của thư viện nhập tĩnh trên các thư viện nhập khác) được gọi là liên kết chuyển tiếp. Nó được thực hiện bằng cách thiết lập thuộc tính đích IMPORTED_LINK_INTERFACE_LIBRARIES. Họ cho rằng thuộc tính này bị xóa và đề xuất sử dụng INTERFACE_LINK_LIBRARIES, nhưng trong trường hợp của tôi (phiên bản cmake 2.8.11.2) chỉ IMPORTED_LINK_INTERFACE_LIBRARIES đang hoạt động.

Vì vậy, ví dụ ở trên cuối CMakeLists.tst cho Liba sẽ trông như thế này:

add_library(LibC STATIC IMPORTED) 
    a̶d̶d̶_̶d̶e̶p̶e̶n̶d̶e̶n̶c̶i̶e̶s̶(̶L̶i̶b̶A̶ ̶L̶i̶b̶C̶)̶ 
    set_property(TARGET LibC PROPERTY IMPORTED_LOCATION /path/to/LibC) 

    set_property(TARGET LibA PROPERTY IMPORTED_LINK_INTERFACE_LIBRARIES LibC) 

Hope thông tin này sẽ có ích cho một ai đó.

Các vấn đề liên quan