我有一个用 cmake 构建的 C++ 库。该库通过单元测试进行测试,我希望将其作为构建的一部分运行。我希望在库或单元测试源更改时运行测试。
我在 cmake 邮件列表的过去帖子中找到了一些帮助:
http://www.cmake.org/pipermail/cmake/2010-January/034419.html
这种方法在单元测试程序上使用 add_custom_command() ,当库是共享或静态时适用于 Linux,当库是静态时适用于 Windows。问题是构建在 Windows 上共享的库。在这种情况下,测试在初始构建中运行,但在库更改时不会运行。
这是一个说明问题的示例:
CMakeLists.txt
cmake_minimum_required(VERSION 2.8)
project(xyz)
SET(BUILD_SHARED_LIBS ON)
#----------- build library
if(${BUILD_SHARED_LIBS})
add_definitions(-DXYZ_SHARED)
endif(${BUILD_SHARED_LIBS})
add_library(${PROJECT_NAME} xyz.cpp xyz.h)
#----------- build unit tests program
add_executable(${PROJECT_NAME}_unit_tests unit_tests.cpp)
target_link_libraries(${PROJECT_NAME}_unit_tests ${PROJECT_NAME})
#----------- run unit tests program after it is built
add_custom_command(TARGET ${PROJECT_NAME}_unit_tests
POST_BUILD COMMAND ${PROJECT_NAME}_unit_tests)
xyz.h
#pragma once
#ifdef XYZ_SHARED
#ifdef _WIN32
#ifdef xyz_EXPORTS
#define XYZ_EXPORT __declspec(dllexport)
#else
#define XYZ_EXPORT __declspec(dllimport)
#endif
#else //_WIN32
#define XYZ_EXPORT
#endif //_WIN32
#else //XYZ_SHARED
#define XYZ_EXPORT
#endif //XYZ_SHARED
XYZ_EXPORT bool xyz_return_true();
xyz.cpp
#include "xyz.h"
XYZ_EXPORT bool xyz_return_true()
{
return true;
}
unit_tests.cpp
#include <iostream>
#include "xyz.h"
int main(int argc, char *argv[])
{
using namespace std;
cout << "running unit tests: ";
if (xyz_return_true()) {
//no error
cout << "pass" << endl;
return 0;
}
//error
cout << "fail" << endl;
return 1;
}
如果我在 Windows 上构建,然后将 xyz.cpp 的函数更改为返回 false 并再次构建,则不会运行测试。在这种情况下,我该怎么做才能使测试运行?
我认为测试没有运行,因为在构建时 xyz_unit_tests.exe 仅依赖于导入库(xyz.lib)。如果库接口未更改,则导入库不会更改。
我正在使用 Visual Studio 10 和 cmake 2.8.11.2。