使用CMake调用外部程序

我试图搜索CMake文档,但我不知道如何从CMake调用外部程序 我想做的事情很少 编译使用makefile的其他第三方依赖项 将定义文件编译为C++/Python存根。 编译定义文件 另一个问题是,处理这些案件的好方法是什么?当CMake中的“C”代表跨平台时,直接从CMake调用shell脚本感觉不那么干净 编辑:我有几个额外的问题。之前,在我的构建中,我预先构建了依赖项,项目本身使用FIND_包(…)来查找依赖项的头/库 现在,我正在使用ExternalProject_Add()编译依赖项

CMake条件:比较文件的时间戳

我需要编写一个自定义命令,在文件a比文件B更新时运行。如何在CMake中执行此操作?谢谢 听起来你想要类似的东西: add_custom_command(OUTPUT B COMMAND ${CMAKE_COMMAND} -Dinput=A -P script_that_generates_B.cmake DEPENDS A ) 其中“B”是输出文件的完整路径,“A”是某个输入文件的完整路径,该命令在生成时运行,每当A发生更改时生成B 为了在构建时执行生成B的规则,还必须依赖于B。

文件(GLOB…)是否在每次cmake调用时搜索目录?

调用文件(GLOB…时,CMake将正则表达式应用于它能找到的所有文件。问题是它是只在第一次cmake调用时执行,还是每次都执行 换句话说,使用文件(GLOB…是否会减慢生成文件的重新生成过程?同样的问题也可以应用于文件(GLOB_RECURSE…每次都会这样做(结果自然可能不同) 别担心它会让你慢下来。构建系统必须在每次调用时对数十个、数百个或数千个文件执行stat(或等效)操作,一两个glob甚至不会显示为一个光点。每次都会执行此操作(结果自然可能不同) 别担心它会让你慢下来。构建系统每次调

CMake:获得路径减去相对元素的完整表示

我想获取一个已设置为路径元素组合(可能是绝对和相对)的变量,并从中获取绝对路径。类似于 Booo::FielSoe::StulySufEngule[()/在C++中运行。例如,我有一些类似于: set(EXTERNAL_LIB_DIR "${CMAKE_SOURCE_DIR}/../external" CACHE PATH "Location of externals") 它可以工作,但在UI中有点难看,因为它可能最终看起来像C:/dev/repo/tool/。/external。我想知道在编

如何安装Cmake C编译器和CXX编译器

我需要一些帮助,用cmake编译这个项目。这是错误消息 $ ./build_avida -- Building for: NMake Makefiles CMake Warning at CMakeLists.txt:1 (PROJECT): To use the NMake generator, cmake must be run from a shell that can use the compiler cl from the command line. This environ

Cmake C制造-L<;路径>-l<;lib>;静态库的链接标志

我使用CMake 2.8构建基于MQX操作系统的应用程序(使用CodeWarrior)。 CMake项目基本上构建了一组静态库(比如LIB1和LIB2)。 然后,我在最终可执行的cmake规则中引用这些库: target_add_executable(X ${some_sources}) target_link_libraries(X LIB1 LIB2) 我的问题是一些符号在多个库中定义。 因此,可以使用如下链接命令: mwldarm <args> -o <output&g

仅在设置cmake时使用缓存值

我有一个变量XX可以通过CMakeList生成。所以我通常做的是: set(X_OVERRIDE CACHE STRING "" "Overrides the generated value for X") MARK_AS_ADVANCED(FORCE X_OVERRIDE) IF("${X_OVERRIDE}" STREQUAL "") set(X ${GENERATED_X}) ELSE() SET(X ${X_OVERRIDE}) ENDIF() 人们通常就是这样做的吗?您的方法的独特特

CMake:如何为单个目标更改编译器

我有一个使用交叉编译器的嵌入式项目。我想介绍一下GoogleTest,它是用本地GCC编译器编译的。另外,使用CTC编译器构建一些单元测试目标 简而言之: 我有3个不同的目标,并用3个不同的编译器编译它们。如何在CMakeLists.txt中表达?我尝试了设置目标属性 但似乎无法使用此命令设置CXX变量 CMake是一个make文件生成器。它会生成一个文件,然后您可以使用该文件进行构建。如果要创建多个目标平台,则需要使用不同的生成器多次运行CMake 因此,您想在CMake中执行的操作是不可能的

CMake:作为其他自定义命令或目标的输出或副产品导入的库

我想从ZIP文件中提取一个静态库,并对其进行链接 具有以下设置: add_library(COMSDK_LIB STATIC IMPORTED GLOBAL) set_property(TARGET COMSDK_LIB PROPERTY IMPORTED_LOCATION "/tmp/lib/libRTSClientSdk.a") 导入的库正在另一个CMakeLists.txt中使用: target_link_libraries(mylib COMSDK_LIB) 导入的库是否可能由另一个

Cmake不使用添加编译选项应用编译选项

我正在尝试使用添加编译选项将cmake与以下编译选项结合使用:add\u compile\u选项(-pipe-O2-std=c++98-W-Wall-pedantic) 但它似乎并没有在编译过程中实际使用 make-n | grep pedantic不返回任何内容 仅供参考,我的cmake命令及其返回的内容: cmake -G"Unix Makefiles" -DARCH:STRING=x86 -Bosef -H. -DCMAKE_C_COMPILER=/usr/bin/gcc -DCMAKE_

Cmake 如何使用ExternalProject_Add获得简单的make调用?

我需要ExternalProject\u Add为makefile执行所有必要步骤的外部项目调用一个命令。我需要在外部项目源代码树顶部的目录中使用“make WITH_OPTION1=no WITH_OPTION2=no”命令。这是我们使用的几十个外部项目之一。大多数符合“配置”模式;制作让安装'但一个好的第三个不这样做,这是一个我认为会很容易 如果我尝试像这样调用make命令: ExternalProject_Add(build-example PREFIX "${CMA

CMake找不到通过自制安装的开放MPI

我使用自制软件安装了OpenMPI,使用brew安装OpenMPI 如果在命令行中运行mpic++main.cpp,则代码编译正确。然后我可以使用mpirun a.out运行它 现在的问题是,当我在Clion中创建CMakelists.txt文件时,它似乎无法找到打开的MPI包: cmake_minimum_required(VERSION 3.15) project(project) set(CMAKE_CXX_STANDARD 17) set(CMAKE_PREFIX_PATH "/us

Cmake 生成OpenBR时出错缺少文件夹C:/Qt/Qt5.4.1/5.4/msvc2013\u 64

我正在尝试按照说明在Windows 10上安装Openbr 步骤4(下载并安装Qt5.4.1)中的链接已失效,因此我从下载了Qt开源版本 当我在步骤6中尝试构建Openbr时,cmake步骤失败 cmake -G "CodeBlocks - NMake Makefiles" -DCMAKE_PREFIX_PATH="C:/opencv-2.4.11/build/install;C:/Qt/Qt5.4.1/5.4/msvc2013_64" -DCMAKE_I

在CMake中创建目录

在CMake中,如果目录不存在,我想创建一个目录。如何创建此目录?何时创建目录 在构建系统生成时 要在CMake生成生成系统时创建目录 file(MAKE_DIRECTORY ${directory}) 在构建时 在add_custom_command()命令(向生成的生成系统添加自定义生成规则)和add_custom_target()命令(添加没有输出的目标,以便始终生成)中,指定要在生成时执行的命令。通过执行命令${CMAKE_command}-E make_directory创建目录。例

Cmake编译错误

我尝试使用cmake编译项目,但出现以下错误: mostafa@ubuntu:~/oooark$ cmake . CMake Error at CMakeLists.txt:19 (message): In-source builds are not allowed. 例如,运行: rm CMakeCache.txt mkdir build cd build cmake .. make -- Configuring incomplete, errors occurred! 有人能帮我

我能';使用CMake链接库

我用firebreath制作了npAPI插件 我的代码使用了giblib,所以我在CMakeLists.txt中添加了这段代码 find_library(TESTLIB_LIBRARY2 giblib) include_directories(${TESTLIB_INCLUDE_DIRS}) target_link_libraries(UbuntuCaptureTest TESTLIB_LIBRARY2) 我对cmake是个新手 所以我学习了一些关于CMake的教程和firebreath主页上

CMake-DCMAKE_CXX_编译器可以工作,但SET(CMake_CXX_编译器…)被忽略?

在我的工具链文件中,我一直在尝试使用以下行将CPP编译器设置为g++ # specify the cross compiler SET(CMAKE_CXX_COMPILER:FILEPATH /opt/qnx641/host/linux/x86/usr/bin/arm-unknown-nto-qnx6.4.0-g++) 这似乎没有被使用,所以我尝试了一些正确的东西只是为了苏 SET(CMAKE_C_COMPILER:FILEPATH /junk/gcc) 好吧,太夸张了,但这样我肯定CM

父目录CMake文件夹的add_子目录中的CMake FindPackage

我有一个CMake结构: 主要项目/ mainproject/cmake/FindMyPackage.cmake mainproject/CMakeLists.txt 插件/ plugin/CMakeLists.txt 在上面的CMakeLists.txt中,我调用 在上面定义的目录之外添加plugin/CMakeLists.txt子目录 在第二个CMakeLists.txt中,我调用findpackagempackage REQUIRED 其中给出了错误消息: CMake Error at [

CMake找不到源目录(安装Eigen)

我正在Ubuntu上安装库。我按照说明在下载的源目录旁边创建了一个“构建目录”。也就是说,我有两个目录:eigen-eigen-1306d75b4a21用于源代码,一个空的eigen-build用于构建 然后我做了: cd eigen-build cmake ../eigen-eigen-1306d75b4a21/ sudo make install make install之后立即发生错误,并停止安装: CMake Error: The source directory "/home/use

Cmake:可以从Linux交叉生成构建系统吗?

是否可以使用cmake在一个平台上为另一个平台生成构建系统?例如,我最感兴趣的是,是否可以为Linux项目生成一组Visual Studio解决方案文件,或mingw32 make make文件,或nmake文件 其目的是制造类似于makedisttarget在automake中生产的东西。但是,我不需要像make dist那样使用它,也就是说,我只想生成解决方案文件,就像在Windows中运行cmake一样 然后,用户可以在自己的机器上使用创建的构建系统构建包 如果可能的话,我该怎么做?Cma

Cmake 仅将变量向下传递到子目录

如何将特定于项目的变量传递到子目录?我想知道是否有一种“官方”的方法可以做到这一点: # (CMAKE_BUILD_TYPE is one of None, Debug, Release, RelWithDebInfo) # ... # set specific build type for 'my_library' set( CMAKE_BUILD_TYPE_COPY "${CMAKE_BUILD_TYPE}" ) set( CMAKE_BUILD_TYPE "Release" ) add

CMake工作流?

我正在学习CMake,在理解其多步骤工作流程方面遇到了问题。到目前为止,我的理解是您: 编写一个CMakeLists.txt 从子目录运行cmake,生成生成文件(在我的例子中是生成文件) 运行make 但是,我不明白您应该如何处理不同的目标(发行版与调试版)。通过在两个不同的子目录中运行CMake 另外,我不明白你为什么要编辑cmakcache.txt(还有一个GUI工具)。要通过传递不同的选项来模拟您使用/configure将要完成的任务?您做得非常正确。write CMakeLists

Cmake find_包如何在配置模式下工作

我在配置模式下使用find_包查找Qt5: find_package(Qt5 CONFIG REQUIRED COMPONENTS Core) 我没有指定CMAKE_PREFIX_路径,路径中未设置/home/user/Qt/5.5/gcc_64/bin,但CMAKE会查找*Config.CMAKE文件: /home/user/Qt/5.5/gcc_64/lib/cmake/Qt5/Qt5Config.cmake /home/user/Qt/5.5/gcc_64/lib/cmake/Qt5Co

Cmake 设置CLion构建和二进制目录

我正在尝试在CLion的项目中构建libwebsockets。在构建过程中,libwebsockets创建其他文件所需的头文件,并将其放入PROJECT_BINARY_DIR中。CLion在为项目创建的随机构建目录中构建所有内容,并且头文件最终位于该目录中。我试过: 设置websockets\u BINARY\u DIR变量 设置CMAKE\u RUNTIME\u OUTPUT\u目录变量 设置CMAKE\u LIBRARY\u OUTPUT\u目录变量 更改CMake缓存中的每个变量,使其远

cmake是否在交叉编译器Linaro链上工作?

我有一个C项目,它支持许多平台。它的发电机坏了 Makefiles、NMake Makefiles、MSVC 6、7、8、9、11、Eclipse CDT4-Unix Makefiles等。我在Windows7上用cmake生成了MSVC9解决方案。信息技术 没关系 现在,我想在的TI Sitara SDK上生成ARM Cortex A8项目 以上C项目。TI Sitara SDK安装在Ubuntu 14.04操作系统主机上 电脑。有一个交叉编译工具链:Ubuntu PC上的Linaro 从原始

避免CMake中的进度消息

我是否可以删除以下类型的CMake进度消息: [1%]制作[5]:进入目录… [9%]正在生成CXX对象 我尝试过将CMAKE\u VERBOSE\u MAKEFILE,CMAKE\u COLOR\u MAKEFILE设置为关闭,以及其他设置,但都不起作用。 我在这里发现CMAKE\u RULE\u MESSAGES=OFF: 但对我不起作用。 还添加了此处建议的功能: 并且对我也不起作用。将全局属性设置为关闭: 您引用的文档说明:如果存在CMAKE\u规则\u消息缓存条目,则其值将初始化此属性

用户定义的CMake函数的选项

是否可以更新用户定义的函数print2Argss.t。它将接受诸如内置CMake函数之类的选项?CMake通过CMakeParseArguments提供此功能。您没有像在示例中那样在函数签名中指定参数 CMake接受的参数多于函数签名中给出的参数。在变量中定义选项、单值参数和参数对,并将它们传递给cmake\u parse\u arguments。此命令设置多个变量,您可以使用这些变量检查设置了哪些参数 文档和示例: function(print2Args arg1 arg2) messa

如何使用cmake指定彼此之间的子项目依赖关系?

假设我有这样的项目: Root +-- SubA +-- SubB +-- SubC ... 所有子文件夹都有自己的CMakeLists.txt,根文件夹如下所示: add_subdirectory(SubA) add_subdirectory(SubB) add_subdirectory(SubC) 如果我通过make开始构建,3个子项目将一个接一个地构建,如果我通过make-j4开始构建,那么顺序可能是随机的 我想问的是如何设置这些子项目之间的依赖关系。如何使SubB和S

CMake包含导入库的依赖项而不链接

我正在使用CMake 3.5.2 考虑以下情况。我有一个导入的库Foo::Foo: add_library(Foo::Foo UNKNOWN IMPORTED) 已使用适当的属性填充此导入的库: set_target_properties(Foo::Foo PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "/path/to/include/blah" "/another/path/include/other" IMPORTED_LINK_INTERFA

CMAKE_项目名称和项目名称之间的差异?

CMAKE_项目名称和项目名称之间有什么区别 从文件中: 当前项目的名称 这将从最近继承的project()命令中指定当前项目的名称 指定给project命令的项目的名称 这是最新的project()命令的名称 我不明白有什么区别 我应该在什么时候使用CMAKE\u PROJECT\u NAME?什么时候应该使用文档中的PROJECT\u NAME?,我看不出这两个变量之间的区别 不同之处在于,CMAKE_PROJECT_NAME是来自根CMakeLists.txt的上一次PROJECT调用

cmake:如果(文件1比文件2新)损坏了?

作为构建过程的一部分,我们将构建的二进制文件安装到特定位置 我有一个定制的cmake脚本,它检查构建的二进制文件的时间戳,如果它比安装的二进制文件更新,则复制它 以下是脚本的摘录: if(SRC_FILE IS_NEWER_THAN DEST_FILE) message(STATUS "installing ${DEST_FILE}") execute_process( COMMAND ${CMAKE_COMMAND} -E make_d

Cmake更改中断构建

当我安装库时,它会转到${CMAKE\u install\u PREFIX} 当我find_包(a库)时,它搜索${CMAKE_INSTALL_PREFIX} 在windows中,${CMAKE\u INSTALL\u PREFIX}默认为c:\Program Files。这很有效。但是在${CMAKE\u INSTALL\u PREFIX}中,默认为c:\Program Files\${PROJECT\u NAME} 现在,当我安装库A时,它会转到C:\Program Files\A 当我从库

确定CMake中的汇编程序版本?

在决定构建什么以及如何构建之前,我们需要确定GNU的AS(GAS)版本。一些较旧的GAS,如CentOS 5和OpenBSD 6的分布式GAS,无法处理SSE4及以上版本。我们需要禁用使用SSE4、AES-NI、SHA、AVX和BMI的代码路径 我们的主要构建系统是GNU Make,它: 根据Cmake的说法,Cmake对程序集源文件具有基本支持。但是它没有讨论如何获得汇编程序的版本 在使用CMake时,我们如何确定汇编程序版本?而不是试图找到汇编程序版本,并硬编码一个关于哪些汇编程序版本支持哪

CMake安装目标给定的目标不是可执行文件、库或模块

我正在尝试构建一个包含单个bash脚本的debian包。脚本由以下程序生成: go.sh: #!/bin/bash cat >main <<EOF #!/bin/bash echo $@ EOF chmod +x main 这只会给我一条神秘的错误信息: CMake Error at CMakeLists.txt:7 (install): install TARGETS given target "main" which is not an executable, l

Cmake 韩元';使用set_属性和COMPILE_PDB_名称重写/Fd标志

我更改了cmake版本,现在似乎发布的.pdb文件始终称为“vc100.pdb” 我想更改该名称,覆盖cl.exe的/Fd标志 更改CMakeLists.txt时,此操作有效:添加编译选项(“/FdRelease/.pdb”) 这不起任何作用:set\u属性(源属性COMPILE\u PDB\u NAME.PDB) 在我看来,第二个选项是正式的,但我无法让它工作,文件仍然称为“vc100.pdb”。 为什么它不起作用?如果我决定第一种方法,有什么需要考虑的吗? Windows 10 64位,cm

CMake:从多行文本文件获取版本

我有一个文件version.txt VERSION_MAJOR 1 VERSION_MINOR 1 VERSION_PATCH 3 我想使用cmake为主要、次要和补丁添加定义 我试过使用 file(STRING "version.txt" myvar) 但这只是将整个文件放入myvar 如何获取数字?您使用的文件不正确,您想使用它将文件内容读入变量 file(READ "version.txt" ver) 将文件内容放入变量后,就可以与捕获组一起使用,并使用 创建一个带有捕获组的正则表

cmake中的默认选项设置

考虑到以下因素: option (BUILD_SERVER "Build in server configuration" OFF) option (BUILD_TOOLS "Build external tools" ON) if (BUILD_SERVER) set (BUILD_TOOLS OFF) endif() message (STATUS "BUILD_TOOLS : ${BUILD_TOOLS}") 然后使用ccmake打开BUILD_服务器,然后进行配置,然后手动重

为什么Travis无法识别脚本中已安装的CMake?

我正在尝试为我的应用程序编写一个Travis CI脚本,它需要CMake 3.5或更高版本。可以找到整个Travis脚本。根据我在别处找到的建议,我使用以下方法安装CMake: install: - DEPS_DIR="${TRAVIS_BUILD_DIR}/deps" - mkdir -p ${DEPS_DIR} && cd ${DEPS_DIR} - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then

Cmake Google GMOCK在windows下构建libgmock.a

我尝试在windows下从google构建gmock库,可在github上访问: 我试图在cygwin控制台中使用cmake,但无法构建它 cmake C:\Users\Username\Downloads\googlemock-master\googlemock-master\googlemock "CMake Error: The source directory "C:UsersSETDownloadsgooglemock-mastergooglemock-mastergooglemo

Cmake 默认情况下,使用静态库构建llvm/clang

我需要在Ubuntu版本不同的机器上使用自定义llvm/clang。 我想用静态库替换所有共享库(libc、libm等)来构建我的llvm/clang,以避免过时的共享库导致运行时崩溃。默认情况下有没有链接静态库的方法 我使用CMake来构建clang,并想知道是否有类似于build\u SHARED\u LIBSflag的东西来控制系统库 我的问题与。“我想用静态库替换所有共享库(libc、libm等)来构建llvm/clang”-您有这些库的静态版本(libc、libm)吗?据我所知,gcc

在已安装的目标二进制文件上运行cmake命令

我想在安装目标后在其上运行命令。我看到“”,它似乎是关于在安装所有内容后运行单个脚本。我的问题是每一个目标脚本 我要做的是在已安装的二进制文件上运行patchelf,以更改解释器。这与cmake如何更改已安装二进制文件的RPATH非常相似。看看如何做到这一点,我在cmake_install.cmake(为简洁起见编辑)中看到了这些内容: 这将更改rpath,并在安装二进制文件后剥离它。似乎我所需要做的就是再放一个execute\u进程来运行我的patchelf命令。但我找不到任何方法让cmake

CMake语法:如何否定if(<;constant>;)和if(<;variable | string>;)

CMake的if命令[1]支持多个签名,从 if(<constant>) if(<variable|string>) if(NOT <expression>) if() if() 如果(不是) 如何否定前两个 如果CMake文档是正确的(根据我的经验,这还远远不能确定),那么我的问题可以归结为: 如何将常量、变量或字符串X转换为表达式,并要求X作为布尔值进行计算 [1] 实际上,只是任何参数的占位符,如果,可以将其传递给。甚至可能的if结构列表也被命名为“

Cmake 如何创建包装器库而不公开正在使用的底层库?

使用Cmake,我想知道如何创建包装器库,并让用户仅将其应用程序链接到此库。用户不需要在其链接器标志中指定原始库 例如,我为libwebsockets创建了一个包装器库,名为libcustomws add_library(customws main.c) target_link_libraries(customws websockets) 我希望用户(未安装libwebsockets)能够执行以下操作: add_executable(user_app user_app.c) target_li

cmake-如何更改compile_commands.json输出位置 这里是一个C++项目结构的例子: - {root} - CMakeLists.txt - build/ - compile_commands.json <-- This file gets generated - src/ - CMakeLists.txt - files here - compile_commands.json <-- This is where I want compile_commands.json to be built to -{root} -CMakeLists.txt -建造/ -编译_commands.json

有没有办法指定compile_commands.json的位置 没有办法。我相信设置时生成的compile\u commands.json的路径是正确的 只需创建一个符号链接compile_commands.json->./build/compile_commands.json啊,太糟糕了。那样的话,我就得围绕这个问题写了。顺便说一下,谢谢你的源链接!

如何使用CMake包含asio库?

我正在尝试为一个班级做一个项目,我想用CMake来构建这个项目。我当前的项目看起来像 |-bin |-CMakeLists.txt |-include |-asio-1.12.2 |-chat_message.hpp |-chat_message.cpp |-CMakeLists.txt |-src |-Server.cpp 虽然my Server.cpp需要/include/asio-1.12.2/include中的asio.hpp。 教授有一个makefile,它用标志编译它 -

缺少的变量是:CMAKE\u CUDA\u COMPILE\u WHOLE\u COMPILE

我正在尝试使用CMake使用cuda编译一个库 我希望cuda是可选的,也就是说,如果系统上没有nvcc,我希望我的库可以编译 以下是我如何检查我的CMake中是否有cuda: include(CheckLanguage) check_language(CUDA) if (CMAKE_CUDA_COMPILER) enable_language(CUDA) else() message(WARNING "CUDA not found: GPU features won't be

Cmake 对于rpm/deb,是否有一个类似于%global\uuu需要从cpack中排除的函数?

我们完成了从常规规范文件(rpm)到cpack的转换,并在构建中添加了.deb包 我能够复制rpm规范文件中的所有内容,除了\uuuu requires\uu exclude\u from。 我们有一个需要可选库的文件。(包含的二进制文件是可选的,仅在用户需要时调用),但生成的rpm/deb包仍然需要依赖关系 在RPM规范中,我们从依赖项扫描中完全排除了这个特定的二进制文件,这非常有效,但我无法在RPM和DEB生成器的cpack中重现它 我能想象的唯一方法是创建/使用我自己的规范文件作为模板,但

cmake帮助器以创建<;包装>_来自本地libs的根变量

我们有一个包含许多模块的大型项目(共享库)。它们没有静态依赖关系,工作起来更像插件。我们希望构建系统能够在构建特定的可执行文件(exeA)时使用find_包(modA)。我们也不希望生成的项目文件包含每个模块(在VisualStudio等中很难处理),因此它应该只包含(添加库)由特定的CMakeLists.txt(exeA)构建的可执行文件所需的模块。 一种方法是使用helper函数从项目根文件夹中查找所有Config.cmake文件,并将它们添加到cmake_PREFIX_PATH或生成根变量

上一页 1 2 ...  8   9   10   11    12   13   14  ... 下一页 最后一页 共 120 页