本文共 4610 字,大约阅读时间需要 15 分钟。
在本节中,我们将展示如何将生成的源文件添加到应用程序的构建过程中。 对于此示例,我们将创建一个预先计算的平方根表,作为构建过程的一部分,然后将该表编译到我们的应用程序中。 为此,我们首先需要一个生成表的程序。 在MathFunctions子目录中,一个名为MakeTable.cxx的新源文件就是这样做的。
// A simple program that builds a sqrt table#include#include #include int main (int argc, char *argv[]){ int i; double result; // make sure we have enough arguments if (argc < 2) { return 1; } // open the output file FILE *fout = fopen(argv[1],"w"); if (!fout) { return 1; } // create a source file with a table of square roots fprintf(fout,"double sqrtTable[] = {\n"); for (i = 0; i < 10; ++i) { result = sqrt(static_cast (i)); fprintf(fout,"%g,\n",result); } // close the table with a zero fprintf(fout,"0};\n"); fclose(fout); return 0;}
请注意,该表是作为有效的C ++代码生成的,并且将输出的文件的名称作为参数传入。 下一步是将适当的命令添加到MathFunctions的CMakeLists.txt文件以构建MakeTable可执行文件,然后在构建过程中运行它。 完成此操作需要一些命令,如下所示。
# first we add the executable that generates the tableadd_executable(MakeTable MakeTable.cxx)# add the command to generate the source codeadd_custom_command ( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/Table.h COMMAND MakeTable ${CMAKE_CURRENT_BINARY_DIR}/Table.h DEPENDS MakeTable )# add the binary tree directory to the search path for# include filesinclude_directories( ${CMAKE_CURRENT_BINARY_DIR} )# add the main libraryadd_library(MathFunctions mysqrt.cxx ${CMAKE_CURRENT_BINARY_DIR}/Table.h )
首先添加MakeTable的可执行文件。 然后我们添加一个自定义命令,指定如何通过运行MakeTable来生成Table.h。 接下来我们要让CMake知道mysqrt.cxx依赖于生成的文件Table.h。 这是通过将生成的Table.h添加到库MathFunctions的源列表中完成的。 我们还必须将当前二进制目录添加到包含目录列表中,以便可以在mysqrt.cxx中找到并包含Table.h。 构建此项目时,它将首先构建MakeTable可执行文件(DEPENDS MakeTable的作用,如果可执行已有则可以没有这句话)。 然后它将运行MakeTable以生成Table.h。 最后,它将编译包含Table.h的mysqrt.cxx以生成MathFunctions库。 此时,顶级CMakeLists.txt文件包含我们添加的所有功能,如下所示:
cmake_minimum_required (VERSION 2.6)project (Tutorial)include(CTest)# The version number.set (Tutorial_VERSION_MAJOR 1)set (Tutorial_VERSION_MINOR 0)# does this system provide the log and exp functions?include (${CMAKE_ROOT}/Modules/CheckFunctionExists.cmake)check_function_exists (log HAVE_LOG)check_function_exists (exp HAVE_EXP)# should we use our own math functionsoption(USE_MYMATH "Use tutorial provided math implementation" ON)# configure a header file to pass some of the CMake settings# to the source codeconfigure_file ( "${PROJECT_SOURCE_DIR}/TutorialConfig.h.in" "${PROJECT_BINARY_DIR}/TutorialConfig.h" )# add the binary tree to the search path for include files# so that we will find TutorialConfig.hinclude_directories ("${PROJECT_BINARY_DIR}")# add the MathFunctions library?if (USE_MYMATH) include_directories ("${PROJECT_SOURCE_DIR}/MathFunctions") add_subdirectory (MathFunctions) set (EXTRA_LIBS ${EXTRA_LIBS} MathFunctions)endif (USE_MYMATH)# add the executableadd_executable (Tutorial tutorial.cxx)target_link_libraries (Tutorial ${EXTRA_LIBS})# add the install targetsinstall (TARGETS Tutorial DESTINATION bin)install (FILES "${PROJECT_BINARY_DIR}/TutorialConfig.h" DESTINATION include)# does the application runadd_test (TutorialRuns Tutorial 25)# does the usage message work?add_test (TutorialUsage Tutorial)set_tests_properties (TutorialUsage PROPERTIES PASS_REGULAR_EXPRESSION "Usage:.*number" )#define a macro to simplify adding testsmacro (do_test arg result) add_test (TutorialComp${arg} Tutorial ${arg}) set_tests_properties (TutorialComp${arg} PROPERTIES PASS_REGULAR_EXPRESSION ${result} )endmacro (do_test)# do a bunch of result based testsdo_test (4 "4 is 2")do_test (9 "9 is 3")do_test (5 "5 is 2.236")do_test (7 "7 is 2.645")do_test (25 "25 is 5")do_test (-25 "-25 is 0")do_test (0.0001 "0.0001 is 0.01")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// does the platform provide exp and log functions?#cmakedefine HAVE_LOG#cmakedefine HAVE_EXP
MathFunctions的CMakeLists.txt文件如下所示:
# first we add the executable that generates the tableadd_executable(MakeTable MakeTable.cxx)# add the command to generate the source codeadd_custom_command ( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/Table.h DEPENDS MakeTable COMMAND MakeTable ${CMAKE_CURRENT_BINARY_DIR}/Table.h )# add the binary tree directory to the search path# for include filesinclude_directories( ${CMAKE_CURRENT_BINARY_DIR} )# add the main libraryadd_library(MathFunctions mysqrt.cxx ${CMAKE_CURRENT_BINARY_DIR}/Table.h)install (TARGETS MathFunctions DESTINATION bin)install (FILES MathFunctions.h DESTINATION include)
转载地址:http://bqhzb.baihongyu.com/