说明

本文档只说明与官方文档的不同的地方,也就是说我在跟着官方文档走的时候我出现的问题的解决方法

安装

首先是MathFunctions的CMakeLists.txt

add_library(MathFunctions mysqrt.cxx)

target_include_directories(MathFunctions
                            INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}
                            )
install(TARGETS MathFunctions DESTINATION lib)
install(FILES MathFunctions.h DESTINATION include)

然后是Step4的CMakeLists.txt

cmake_minimum_required(VERSION 3.10)

project(Tutorial VERSION 1.0)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)

option(USE_MYMATH "Use tutorial provided math implementation" ON)

if(USE_MYMATH)
    add_subdirectory(MathFunctions)
    list(APPEND EXTRA_LIBS MathFunctions)
endif()

configure_file(TutorialConfig.h.in TutorialConfig.h)

# 添加子目录
# add_subdirectory(MathFunctions)
add_executable(Tutorial tutorial.cxx)

target_link_libraries(Tutorial PUBLIC ${EXTRA_LIBS})

# 添加${PROJECT_BINARY_DIR}是为了能够找到TutorialConfig.h
# 添加${PROJECT_SOURCE_DIR}/MathFunctions是为了找到mysqrt.h
target_include_directories(Tutorial PUBLIC
                            "${PROJECT_BINARY_DIR}"
                            )   

install(TARGETS Tutorial DESTINATION bin)
install(FILES "${PROJECT_BINARY_DIR}/TutorialConfig.h" DESTINATION include)

#启动测试
enable_testing()
#测试
add_test(NAME Runs COMMAND Tutorial 25)
#测试不加参数
add_test(NAME Usage COMMAND Tutorial)
#给这个测试增加属性,通过PASS_REGULAR_EXPRESSION判断输出的结果是否包含后面的字符串
set_tests_properties(Usage PROPERTIES PASS_REGULAR_EXPRESSION "Usage:./Tutorialnumber")

#定义一个函数用来测试
#第一个是函数名do_test,后面是参数
function(do_test target arg result)
    add_test(NAME Comp${arg} COMMAND ${target} ${arg})
    set_tests_properties(Comp${arg} PROPERTIES PASS_REGULAR_EXPRESSION ${result})
endfunction(do_test target arg result)
#调用函数
do_test(Tutorial 4 "4 is 2")
do_test(Tutorial 9 "9 is 3")
do_test(Tutorial 5 "5 is 2.236")
do_test(Tutorial 7 "7 is 2.645")
do_test(Tutorial 25 "25 is 5")
do_test(Tutorial -25 "-25 is [-nan|nan|0]")
do_test(Tutorial 0.0001 "0.0001 is 0.01")

最后执行cmake命令

#此时的目录结构
Step4
	MathFunctions
		CMakeLists.txt
		MathFunctions.h
		mysqrt.cxx
	CMakeLists.txt
	tutorial.cxx
	TutorialConfig.h.in
#首先创建目录
mkdir step4_build && cd step4_build
cmake ../Step4/
#构建
cmake --build . 
#安装,按照官方文档使用cmake --install .,但是我这里没反应,所以我用了make命令
#两种方式,一种是直接安装,安装的结果在/usr/local/bin,include和lib下面,另一种是加参数CMAKE_INSTALL_PREFIX,指定了安装的目录,如下
sudo make install
sudo make install CMAKE_INSTALL_PREFIX=/home/ubuntu/mycmake/build
#在目录step4_build下面,执行命令进行测试
make test