2016-02-13 16 views
5

Vì vậy, tôi đang làm một phần của dự án một thư viện với một số tiêu đề là giao diện cho thư viện và phần còn lại là riêng tư với thư viện. Vì vậy, cho thư viện của tôi phần cmake trông giống như:CMake kiểm tra thư viện, vấn đề vị trí tiêu đề

add_library(${PROJECT_NAME} ${PROJECT_SOURCES} "${PROJECT_BINARY_DIR}/libversion.h") 
add_library(my::lib ALIAS ${PROJECT_NAME}) 

target_include_directories(${PROJECT_NAME} 
    PRIVATE ${Boost_INCLUDE_DIRS} 
    PRIVATE ${PROJECT_BINARY_DIR} #to locate libversion.h 
    INTERFACE ${PUBLIC_INCLUDE_HEADERS} 
    ) 

Và sau đó mục tiêu thử nghiệm của tôi:

add_executable(${TEST_NAME} ${TEST_SOURCES}) 
add_test(NAME LibTest COMMAND ${TEST_NAME}) 

target_link_libraries(${TEST_NAME} 
    PRIVATE ${Boost_LIBRARIES} 
    PRIVATE my::lib 
    ) 

Nhưng điều này chỉ cho phép tôi để kiểm tra giao diện công cộng của tôi. Nếu tôi muốn đơn vị kiểm tra thư viện của tôi, làm thế nào tôi sẽ đi về tuyên bố truy cập vào các tiêu đề còn lại trong dự án lib? Cách tôi thấy nó sẽ thêm một mục tiêu hoàn toàn mới my::lib::testing khai báo giao diện là thư mục nguồn hiện tại (nơi tất cả các tiêu đề hiện đang được định vị, tách riêng khỏi các tiêu đề riêng tư là một vấn đề khác mà tôi chưa xử lý). Vì vậy, một cái gì đó như thế này:

add_library(${PROJECT_NAME}_TESTING ${PROJECT_SOURCES} "${PROJECT_BINARY_DIR}/libversion.h") 
add_library(my::lib::testing ALIAS ${PROJECT_NAME}_TESTING) 

target_include_directories(${PROJECT_NAME}_TESTING 
    PRIVATE ${Boost_INCLUDE_DIRS} 
    PRIVATE ${PROJECT_BINARY_DIR} #to locate libversion.h 
    INTERFACE ${CMAKE_CURRENT_SOURCE_DIR} 
    ) 

Nhưng điều này đòi hỏi hai mục tiêu khác nhau sẽ được xây dựng tùy thuộc vào cách sử dụng. Một cho ứng dụng của tôi liên kết với bí danh my::lib và một cho thử nghiệm đơn vị, liên kết bí danh my::lib::testing.

Câu hỏi của tôi là, làm cách nào để tiêu đề riêng biệt để tôi chỉ có thể có các tiêu đề INTERFACE của mình được hiển thị theo mục tiêu, nhưng vẫn truy cập các tiêu đề còn lại theo mục tiêu thử nghiệm của tôi?

Trả lời

3

Cả mục PRIVATE và PUBLIC điền thuộc tính INCLUDE_DIRECTORIES của mục tiêu, vì vậy bạn có thể thử sử dụng nó trong target_include_directories cho dự án thử nghiệm.

add_executable(${TEST_NAME} ${TEST_SOURCES}) 
add_test(NAME LibTest COMMAND ${TEST_NAME}) 

target_link_libraries(${TEST_NAME} 
    PRIVATE ${Boost_LIBRARIES} 
    PRIVATE my::lib 
    ) 

target_include_directories(${TEST_NAME} PRIVATE $<TARGET_PROPERTY:my::lib,INCLUDE_DIRECTORIES>) 
Các vấn đề liên quan