У меня есть проект 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" );
}
Есть ли способ проверить, существуют ли символы для всех объектных файлов в статической библиотеке, без необходимости писать тестовый код, который их покроет?