Ссылка на тест верна для статической библиотеки C ++ с использованием CMake - PullRequest
0 голосов
/ 29 декабря 2018

У меня есть проект CMake, который создает статические библиотеки, и они будут связаны с несколькими другими проектами C ++ для увеличения повторного использования кода.

Проект еще не содержит никакого тестирования, и я хочу начать его добавлениеи как можно быстрее увеличить охват тестовым кодом.Это потребует немалой работы, поскольку код не очень модульный и может занять месяцы, прежде чем он достигнет уровня, который я считаю приемлемым.

Один быстрый выигрыш, который, я считаю, улучшит тестирование, - это проверкачто эти статические библиотеки правильно связаны со сторонними библиотеками, которые они используют.Для этого я использую CMake, чтобы связать эти статические библиотеки с тестовым исполняемым файлом.

# Creating static library
# -------
add_library(StaticLib STATIC
    ${STATICLIB_SRC}
    ${STATICLIB_HEADERS}
)

target_link_libraries(StaticLib ${THIRD_PARTY_LIBRARIES})

target_include_directories(StaticLib 
PUBLIC 
${THIRD_PARTY_INCLUDES})
# -------

# Creating test executable, test using Boost
# -------
#Add compile target
add_executable(LibTest test.cpp)

# Add include directories
target_include_directories(LibTest 
    PRIVATE
    ${BOOST_INCLUDES} 
    $<TARGET_PROPERTY:StaticLib,INTERFACE_INCLUDE_DIRECTORIES>
)

# Link to dependencies
target_link_libraries(LibTest
${BOOST_LIBS}
StaticLib
)
# -------

Однако я заметил, что простое связывание не проверяет все недостающие символы в статических библиотеках.Он будет проверять только пропущенные символы в объектных файлах, на которые должен ссылаться тест.

Например, этот test.cpp выдаст ошибку времени ссылки, если сторонняя библиотека не связана правильно, потому что Foo не может бытьэкземпляр:

// This is test.cpp
// The below will cause a link time error, if third party libraries are not linked correctly 
BOOST_AUTO_TEST_CASE(FooTest)
{
    Foo f = Foo();  // Defined in StaticLib and uses third party libraries
    BOOST_TEST_MESSAGE( "passed" );
}

Однако этот не вызовет ошибку:

// This is test.cpp
// The below will *not* cause a link time error, if third party libraries are not linked correctly 
BOOST_AUTO_TEST_CASE(FooTest)
{
    // No Foo being instantiated 
    BOOST_TEST_MESSAGE( "passed" );
}

Есть ли способ проверить, существуют ли символы для всех объектных файлов в статической библиотеке, без необходимости писать тестовый код, который их покроет?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...