测试链接对于使用CMake的C ++静态库是正确的

时间:2018-12-29 16:48:24

标签: c++ boost cmake

我有一个构建静态库的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
)
# -------

但是,我注意到仅链接它并不会检查静态库中所有丢失的符号。它将仅检查测试需要链接到的目标文件中是否缺少符号。

例如,如果第三方库未正确链接,则由于无法实例化Foo,此test.cpp将给出链接时间错误:

// 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" );
}

有什么方法可以检查静态库中所有目标文件中是否存在符号,而不必编写覆盖它们的测试代码?

0 个答案:

没有答案