ubuntu@ubuntu:$ vim TutorialConfig.h.in
ubuntu@ubuntu:$ cat TutorialConfig.h.in
// the configured options and settings for Tutorial
#define Tutorial_VERSION_MAJOR @Tutorial_VERSION_MAJOR@#define Tutorial_VERSION_MINOR @Tutorial_VERSION_MINOR@#cmakedefine USE_MYMATH
ubuntu@ubuntu:$
Cxx file
ubuntu@ubuntu:$ vim tutorial.cxx
ubuntu@ubuntu:$ cat tutorial.cxx
// A simple program that computes the square root of a number#include<iostream>#include<string>#include"TutorialConfig.h"// should we include the MathFunctions header?#include"MathFunctions.h"intmain(int argc,char* argv[]){if(argc <2){// report version
std::cout << argv[0]<<" Version "<< Tutorial_VERSION_MAJOR <<"."<< Tutorial_VERSION_MINOR << std::endl;
std::cout <<"Usage: "<< argv[0]<<" number"<< std::endl;return1;}// convert input to doubleconstdouble inputValue = std::stod(argv[1]);// which square root function should we use?constdouble outputValue = mathfunctions::sqrt(inputValue);
std::cout <<"The square root of "<< inputValue <<" is "<< outputValue
<< std::endl;return0;}
ubuntu@ubuntu:$
License.txt file
ubuntu@ubuntu:$ vim License.txt
ubuntu@ubuntu:$ cat License.txt
This is the opensource License.txt file introduced in
CMake/Tutorial/Step9...
ubuntu@ubuntu:$
Top CMake file
ubuntu@ubuntu:$ vim CMakeLists.txt
ubuntu@ubuntu:$ cat CMakeLists.txt
cmake_minimum_required(VERSION 3.15)
# set the project name and version
project(Tutorial VERSION 1.0)
# specify the C++ standard
add_library(tutorial_compiler_flags INTERFACE)
target_compile_features(tutorial_compiler_flags INTERFACE cxx_std_11)
# add compiler warning flags just when building this project via
# the BUILD_INTERFACE genex
set(gcc_like_cxx "$<COMPILE_LANG_AND_ID:CXX,ARMClang,AppleClang,Clang,GNU,LCC>")
set(msvc_cxx "$<COMPILE_LANG_AND_ID:CXX,MSVC>")
target_compile_options(tutorial_compiler_flags INTERFACE
"$<${gcc_like_cxx}:$<BUILD_INTERFACE:-Wall;-Wextra;-Wshadow;-Wformat=2;-Wunused>>"
"$<${msvc_cxx}:$<BUILD_INTERFACE:-W3>>"
)
# control where the static and shared libraries are built so that on windows
# we don't need to tinker with the path to run the executable
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}")
option(BUILD_SHARED_LIBS "Build using shared libraries" ON)
# configure a header file to pass some of the CMake settings
# to the source code
configure_file(TutorialConfig.h.in TutorialConfig.h)
# add the MathFunctions library
add_subdirectory(MathFunctions)
# add the executable
add_executable(Tutorial tutorial.cxx)
target_link_libraries(Tutorial PUBLIC MathFunctions tutorial_compiler_flags)
# add the binary tree to the search path for include files
# so that we will find TutorialConfig.h
target_include_directories(Tutorial PUBLIC
"${PROJECT_BINARY_DIR}"
)
# add the install targets
install(TARGETS Tutorial DESTINATION bin)
install(FILES "${PROJECT_BINARY_DIR}/TutorialConfig.h"
DESTINATION include
)
# enable testing
include(CTest)
# does the application run
add_test(NAME Runs COMMAND Tutorial 25)
# does the usage message work?
add_test(NAME Usage COMMAND Tutorial)
set_tests_properties(Usage
PROPERTIES PASS_REGULAR_EXPRESSION "Usage:.*number"
)
# define a function to simplify adding tests
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 a bunch of result based tests
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")
# setup installer
include(InstallRequiredSystemLibraries)
set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/License.txt")
set(CPACK_PACKAGE_VERSION_MAJOR "${Tutorial_VERSION_MAJOR}")
set(CPACK_PACKAGE_VERSION_MINOR "${Tutorial_VERSION_MINOR}")
set(CPACK_SOURCE_GENERATOR "TGZ")
include(CPack)
ubuntu@ubuntu:$
ubuntu@ubuntu:$ vim MakeTable.cxx
ubuntu@ubuntu:$ cat MakeTable.cxx
// A simple program that builds a sqrt table
#include <cmath>#include <fstream>#include <iostream>
int main(int argc, char* argv[]){
// make sure we have enough arguments
if(argc <2){return1;}
std::ofstream fout(argv[1], std::ios_base::out);
const bool fileOpen = fout.is_open();if(fileOpen){
fout <<"double sqrtTable[] = {"<< std::endl;for(int i =0; i <10; ++i){
fout << sqrt(static_cast<double>(i))<<","<< std::endl;}
// close the table with a zero
fout <<"0};"<< std::endl;
fout.close();}return fileOpen ? 0:1; // return0if wrote the file}
ubuntu@ubuntu:$
ubuntu@ubuntu:$ vim mysqrt.cxx
ubuntu@ubuntu:$ cat mysqrt.cxx
#include <iostream>#include "MathFunctions.h"
// include the generated table
#include "Table.h"
namespace mathfunctions {
namespace detail {
// a hack square root calculation using simple operations
double mysqrt(double x){if(x <=0){return0;}
// use the table to helpfind an initial value
double result = x;if(x >=1&& x <10){
std::cout <<"Use the table to help find an initial value "<< std::endl;
result = sqrtTable[static_cast<int>(x)];}
// do ten iterations
for(int i =0; i <10; ++i){if(result <=0){
result =0.1;}
double delta = x - (result * result);
result = result + 0.5 * delta / result;
std::cout <<"Computing sqrt of "<< x <<" to be "<< result << std::endl;}return result;}}}
ubuntu@ubuntu:$
MathFunctions CMake file
ubuntu@ubuntu:$ vim CMakeLists.txt
ubuntu@ubuntu:$ cat CMakeLists.txt
# add the library that runs
add_library(MathFunctions MathFunctions.cxx)# state that anybody linking to us needs to include the current source dir# to find MathFunctions.h, while we don't.
target_include_directories(MathFunctions
INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})# should we use our own math functions
option(USE_MYMATH "Use tutorial provided math implementation" ON)
if(USE_MYMATH)# first we add the executable that generates the table
add_executable(MakeTable MakeTable.cxx)# add the command to generate the source code
add_custom_command(
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/Table.h
COMMAND MakeTable ${CMAKE_CURRENT_BINARY_DIR}/Table.h
DEPENDS MakeTable
)# add the main library
add_library(SqrtLibrary STATIC
mysqrt.cxx
${CMAKE_CURRENT_BINARY_DIR}/Table.h
)# state that anybody linking to us needs to include the current source dir# to find MathFunctions.h, while we don't.# state that we depend on our binary dir to find Table.h
target_include_directories(SqrtLibrary
PRIVATE ${CMAKE_CURRENT_BINARY_DIR})# link our compiler flags interface library
target_link_libraries(SqrtLibrary PUBLIC tutorial_compiler_flags)
target_link_libraries(MathFunctions PRIVATE SqrtLibrary)# state that SqrtLibrary need PIC when the default is shared libraries
set_target_properties(SqrtLibrary PROPERTIES
POSITION_INDEPENDENT_CODE ${BUILD_SHARED_LIBS})
endif()
target_link_libraries(MathFunctions PUBLIC tutorial_compiler_flags)# define the symbol stating we are using the declspec(dllexport) when# building on windows
target_compile_definitions(MathFunctions PRIVATE "EXPORTING_MYMATH")# install libs
set(installable_libs MathFunctions tutorial_compiler_flags)
if(TARGET SqrtLibrary)
list(APPEND installable_libs SqrtLibrary)
endif()
install(TARGETS ${installable_libs} DESTINATION lib)# install include headers
install(FILES MathFunctions.h DESTINATION include)
ubuntu@ubuntu:$
构建cmake工程
BUILD_SHARED_LIBS 开关ON
ubuntu@ubuntu:$mkdir exercise15_build
ubuntu@ubuntu:$cd exercise15_build
ubuntu@ubuntu:$ cmake -DBUILD_SHARED_LIBS=ON ..
-- Build files have been written to: /home/ubuntu/study/cmake-learning/cmake-3.25.0-rc1-tutorial-source/Step10/exercise15_build
ubuntu@ubuntu:$ cmake --build .
ubuntu@ubuntu:$ ls -tlr
total 128
-rw-r--r-- 1 ubuntu ubuntu 142 Oct 2017:03 TutorialConfig.h
drwxrwxr-x 3 ubuntu ubuntu 4096 Oct 2017:03 Testing
-rw-r--r-- 1 ubuntu ubuntu 2689 Oct 2017:03 DartConfiguration.tcl
-rw-r--r-- 1 ubuntu ubuntu 3568 Oct 2017:03 CPackConfig.cmake
-rw-r--r-- 1 ubuntu ubuntu 4033 Oct 2017:03 CPackSourceConfig.cmake
-rw-rw-r-- 1 ubuntu ubuntu 18183 Oct 2017:03 CMakeCache.txt
-rw-rw-r-- 1 ubuntu ubuntu 24411 Oct 2017:03 Makefile
-rw-rw-r-- 1 ubuntu ubuntu 4806 Oct 2017:03 CTestTestfile.cmake
-rw-rw-r-- 1 ubuntu ubuntu 3293 Oct 2017:03 cmake_install.cmake
-rwxrwxr-x 1 ubuntu ubuntu 13752 Oct 2017:04 MakeTable
drwxrwxr-x 3 ubuntu ubuntu 4096 Oct 2017:04 MathFunctions
-rw-rw-r-- 1 ubuntu ubuntu 3922 Oct 2017:04 libSqrtLibrary.a
-rwxrwxr-x 1 ubuntu ubuntu 7816 Oct 2017:04 libMathFunctions.so
-rwxrwxr-x 1 ubuntu ubuntu 14880 Oct 2017:04 Tutorial
drwxrwxr-x 34 ubuntu ubuntu 4096 Oct 2017:04 CMakeFiles
ubuntu@ubuntu:$ ldd Tutorial
linux-vdso.so.1 (0x00007fff6f181000)
libMathFunctions.so => /home/ubuntu/study/cmake-learning/cmake-3.25.0-rc1-tutorial-source/Step10/exercise15_build/libMathFunctions.so (0x00007ff7458c2000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007ff745539000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007ff745321000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ff744f30000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007ff744b92000)
/lib64/ld-linux-x86-64.so.2 (0x00007ff745cc7000)
ubuntu@ubuntu:$
ubuntu@ubuntu:$ cpack
CPack: Create package
CPack: - package: /home/ubuntu/study/cmake-learning/cmake-3.25.0-rc1-tutorial-source/Step10/exercise15_build/Tutorial-1.0-Linux.tar.gz generated.
CPack: Create package using TZ
CPack: Install projects
CPack: - Run preinstall target for: Tutorial
CPack: - Install project: Tutorial []
CPack: Create package
CPack: - package: /home/ubuntu/study/cmake-learning/cmake-3.25.0-rc1-tutorial-source/Step10/exercise15_build/Tutorial-1.0-Linux.tar.Z generated.
ubuntu@ubuntu:$ ls -trl
total 168
-rw-r--r-- 1 ubuntu ubuntu 142 Oct 2017:03 TutorialConfig.h
drwxrwxr-x 3 ubuntu ubuntu 4096 Oct 2017:03 Testing
-rw-r--r-- 1 ubuntu ubuntu 2689 Oct 2017:03 DartConfiguration.tcl
-rw-r--r-- 1 ubuntu ubuntu 3568 Oct 2017:03 CPackConfig.cmake
-rw-r--r-- 1 ubuntu ubuntu 4033 Oct 2017:03 CPackSourceConfig.cmake
-rw-rw-r-- 1 ubuntu ubuntu 18183 Oct 2017:03 CMakeCache.txt
-rw-rw-r-- 1 ubuntu ubuntu 24411 Oct 2017:03 Makefile
-rw-rw-r-- 1 ubuntu ubuntu 4806 Oct 2017:03 CTestTestfile.cmake
-rw-rw-r-- 1 ubuntu ubuntu 3293 Oct 2017:03 cmake_install.cmake
-rwxrwxr-x 1 ubuntu ubuntu 13752 Oct 2017:04 MakeTable
drwxrwxr-x 3 ubuntu ubuntu 4096 Oct 2017:04 MathFunctions
-rw-rw-r-- 1 ubuntu ubuntu 3922 Oct 2017:04 libSqrtLibrary.a
-rwxrwxr-x 1 ubuntu ubuntu 7816 Oct 2017:04 libMathFunctions.so
-rwxrwxr-x 1 ubuntu ubuntu 14880 Oct 2017:04 Tutorial
drwxrwxr-x 3 ubuntu ubuntu 4096 Oct 2017:05 _CPack_Packages
-rwxrwxrwx 1 ubuntu ubuntu 11571 Oct 2017:05 Tutorial-1.0-Linux.sh
-rw-rw-r-- 1 ubuntu ubuntu 7543 Oct 2017:05 Tutorial-1.0-Linux.tar.gz
drwxrwxr-x 34 ubuntu ubuntu 4096 Oct 2017:05 CMakeFiles
-rw-rw-r-- 1 ubuntu ubuntu 781 Oct 2017:05 install_manifest.txt
-rw-rw-r-- 1 ubuntu ubuntu 11032 Oct 2017:05 Tutorial-1.0-Linux.tar.Z
ubuntu@ubuntu:$ tar -tvf Tutorial-1.0-Linux.tar.gz
drwxrwxr-x ubuntu/ubuntu 02022-10-20 17:05 Tutorial-1.0-Linux/include/
-rw-r--r-- ubuntu/ubuntu 3322022-10-20 16:08 Tutorial-1.0-Linux/include/MathFunctions.h
-rw-r--r-- ubuntu/ubuntu 1422022-10-20 17:03 Tutorial-1.0-Linux/include/TutorialConfig.h
drwxrwxr-x ubuntu/ubuntu 02022-10-20 17:05 Tutorial-1.0-Linux/bin/
-rwxr-xr-x ubuntu/ubuntu 148802022-10-20 17:04 Tutorial-1.0-Linux/bin/Tutorial
drwxrwxr-x ubuntu/ubuntu 02022-10-20 17:05 Tutorial-1.0-Linux/lib/
-rw-r--r-- ubuntu/ubuntu 39222022-10-20 17:04 Tutorial-1.0-Linux/lib/libSqrtLibrary.a
-rw-r--r-- ubuntu/ubuntu 78162022-10-20 17:04 Tutorial-1.0-Linux/lib/libMathFunctions.so
ubuntu@ubuntu:$
BUILD_SHARED_LIBS 开关OFF
ubuntu@ubuntu:$ cmake -DBUILD_SHARED_LIBS=OFF ..
-- Build files have been written to: /home/ubuntu/study/cmake-learning/cmake-3.25.0-rc1-tutorial-source/Step10/exercise15_build
ubuntu@ubuntu:$ cmake --build .
ubuntu@ubuntu:$ ls -tlr
total 124
-rw-r--r-- 1 ubuntu ubuntu 142 Oct 2017:09 TutorialConfig.h
drwxrwxr-x 3 ubuntu ubuntu 4096 Oct 2017:09 Testing
-rw-r--r-- 1 ubuntu ubuntu 2689 Oct 2017:09 DartConfiguration.tcl
-rw-r--r-- 1 ubuntu ubuntu 3568 Oct 2017:09 CPackConfig.cmake
-rw-r--r-- 1 ubuntu ubuntu 4033 Oct 2017:09 CPackSourceConfig.cmake
-rw-rw-r-- 1 ubuntu ubuntu 18184 Oct 2017:09 CMakeCache.txt
-rw-rw-r-- 1 ubuntu ubuntu 24411 Oct 2017:09 Makefile
-rw-rw-r-- 1 ubuntu ubuntu 4806 Oct 2017:09 CTestTestfile.cmake
-rw-rw-r-- 1 ubuntu ubuntu 3069 Oct 2017:09 cmake_install.cmake
-rwxrwxr-x 1 ubuntu ubuntu 13752 Oct 2017:09 MakeTable
drwxrwxr-x 3 ubuntu ubuntu 4096 Oct 2017:09 MathFunctions
-rw-rw-r-- 1 ubuntu ubuntu 3922 Oct 2017:09 libSqrtLibrary.a
-rw-rw-r-- 1 ubuntu ubuntu 1708 Oct 2017:09 libMathFunctions.a
-rwxrwxr-x 1 ubuntu ubuntu 14960 Oct 2017:09 Tutorial
drwxrwxr-x 34 ubuntu ubuntu 4096 Oct 2017:09 CMakeFiles
ubuntu@ubuntu:$ ldd Tutorial
linux-vdso.so.1 (0x00007ffe45d90000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f729bf03000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f729bb65000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f729b94d000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f729b55c000)
/lib64/ld-linux-x86-64.so.2 (0x00007f729c48f000)
ubuntu@ubuntu:$
ubuntu@ubuntu:$ cpack
CPack: Create package
CPack: - package: /home/ubuntu/study/cmake-learning/cmake-3.25.0-rc1-tutorial-source/Step10/exercise15_build/Tutorial-1.0-Linux.tar.gz generated.
CPack: Create package using TZ
CPack: Install projects
CPack: - Run preinstall target for: Tutorial
CPack: - Install project: Tutorial []
CPack: Create package
CPack: - package: /home/ubuntu/study/cmake-learning/cmake-3.25.0-rc1-tutorial-source/Step10/exercise15_build/Tutorial-1.0-Linux.tar.Z generated.
ubuntu@ubuntu:$ ls -tlr
total 164
-rw-r--r-- 1 ubuntu ubuntu 142 Oct 2017:09 TutorialConfig.h
drwxrwxr-x 3 ubuntu ubuntu 4096 Oct 2017:09 Testing
-rw-r--r-- 1 ubuntu ubuntu 2689 Oct 2017:09 DartConfiguration.tcl
-rw-r--r-- 1 ubuntu ubuntu 3568 Oct 2017:09 CPackConfig.cmake
-rw-r--r-- 1 ubuntu ubuntu 4033 Oct 2017:09 CPackSourceConfig.cmake
-rw-rw-r-- 1 ubuntu ubuntu 18184 Oct 2017:09 CMakeCache.txt
-rw-rw-r-- 1 ubuntu ubuntu 24411 Oct 2017:09 Makefile
-rw-rw-r-- 1 ubuntu ubuntu 4806 Oct 2017:09 CTestTestfile.cmake
-rw-rw-r-- 1 ubuntu ubuntu 3069 Oct 2017:09 cmake_install.cmake
-rwxrwxr-x 1 ubuntu ubuntu 13752 Oct 2017:09 MakeTable
drwxrwxr-x 3 ubuntu ubuntu 4096 Oct 2017:09 MathFunctions
-rw-rw-r-- 1 ubuntu ubuntu 3922 Oct 2017:09 libSqrtLibrary.a
-rw-rw-r-- 1 ubuntu ubuntu 1708 Oct 2017:09 libMathFunctions.a
-rwxrwxr-x 1 ubuntu ubuntu 14960 Oct 2017:09 Tutorial
drwxrwxr-x 3 ubuntu ubuntu 4096 Oct 2017:10 _CPack_Packages
-rwxrwxrwx 1 ubuntu ubuntu 10537 Oct 2017:10 Tutorial-1.0-Linux.sh
-rw-rw-r-- 1 ubuntu ubuntu 6507 Oct 2017:10 Tutorial-1.0-Linux.tar.gz
-rw-rw-r-- 1 ubuntu ubuntu 780 Oct 2017:10 install_manifest.txt
drwxrwxr-x 34 ubuntu ubuntu 4096 Oct 2017:10 CMakeFiles
-rw-rw-r-- 1 ubuntu ubuntu 9412 Oct 2017:10 Tutorial-1.0-Linux.tar.Z
ubuntu@ubuntu:$ tar -tvf Tutorial-1.0-Linux.tar.gz
drwxrwxr-x ubuntu/ubuntu 02022-10-20 17:10 Tutorial-1.0-Linux/include/
-rw-r--r-- ubuntu/ubuntu 3322022-10-20 16:08 Tutorial-1.0-Linux/include/MathFunctions.h
-rw-r--r-- ubuntu/ubuntu 1422022-10-20 17:09 Tutorial-1.0-Linux/include/TutorialConfig.h
drwxrwxr-x ubuntu/ubuntu 02022-10-20 17:10 Tutorial-1.0-Linux/bin/
-rwxr-xr-x ubuntu/ubuntu 149602022-10-20 17:09 Tutorial-1.0-Linux/bin/Tutorial
drwxrwxr-x ubuntu/ubuntu 02022-10-20 17:10 Tutorial-1.0-Linux/lib/
-rw-r--r-- ubuntu/ubuntu 17082022-10-20 17:09 Tutorial-1.0-Linux/lib/libMathFunctions.a
-rw-r--r-- ubuntu/ubuntu 39222022-10-20 17:09 Tutorial-1.0-Linux/lib/libSqrtLibrary.a
ubuntu@ubuntu:$
运行可执行文件
BUILD_SHARED_LIBS 开关ON
ubuntu@ubuntu:$ ./Tutorial 4294967296
The square root of 4.29497e+09 is 65536
ubuntu@ubuntu:$ ./Tutorial 10
The square root of 10 is 3.16228
ubuntu@ubuntu:$ ./Tutorial
./Tutorial Version 1.0
Usage: ./Tutorial number
ubuntu@ubuntu:$
BUILD_SHARED_LIBS 开关OFF
ubuntu@ubuntu:$ ./Tutorial 4294967296
The square root of 4.29497e+09 is 65536
ubuntu@ubuntu:$ ./Tutorial 10
The square root of 10 is 3.16228
ubuntu@ubuntu:$ ./Tutorial
./Tutorial Version 1.0
Usage: ./Tutorial number
ubuntu@ubuntu:$