當前位置:首頁 » 編程軟體 » cmakelist的編譯

cmakelist的編譯

發布時間: 2022-07-02 10:36:28

❶ windows怎麼使用 cmakelist編譯

CMake是一個比make更高級的編譯配置工具,它可以根據不同平台、不同的編譯器,生成相應的Makefile或者vcproj項目。 通過編寫CMakeLists.txt,可以控制生成的Makefile,從而控制編譯過程。

linux cmakelist 怎麼用

由於調試需要因此研究了一下cmake這個誇平台的編譯工具的使用方法.

1.本人的機器為ubuntu 10.04,在連網的情況下直接在終端輸入:

[cpp] view plain 在CODE上查看代碼片派生到我的代碼片
[email protected]:~#apt-get install cmake

安裝完畢之後可以在/var/cache/apt/archives看到安裝的.deb文件

或者在cmake官網下載cmake for linux

此時有個注意點是建議下載 cmake-2.8.4.tar.gz 而不是

cmake-2.8.4-Linux-i386.tar.gz

下載完成後解壓

[cpp] view plain 在CODE上查看代碼片派生到我的代碼片
[email protected]:/opt#tar -zxvf cmake-2.8.4.tar.gz
然後 cd 到cmake-2.8.4目錄下
[email protected]:/opt/cmake-2.8.4#
[email protected]:/opt/cmake-2.8.4# ./bootstrap
[email protected]:/opt/cmake-2.8.4# make
[email protected]:/opt/cmake-2.8.4# make install
安裝完畢後查看是否安裝成功:
[email protected]:/opt/cmake-2.8.4# cmake --version
cmake version 2.8.4
有以上信息表示安裝cmake成功。

2.cmake 的使用

(1)創建一個工程目錄文件夾,然後創建一個hello.c

[cpp] view plain 在CODE上查看代碼片派生到我的代碼片
#include<stdio.h>
int main()
{
printf(「hello,this is my first using cmake project/n」);
return 0;
}
(2)然後創建一個build目錄(用於編譯生成的相應文件),與hello.c目錄同級

(3)編寫CMakeLists.txt內容如下:(於hello.c目錄同級)

[cpp] view plain 在CODE上查看代碼片派生到我的代碼片
cmake_minimum_required(VERSION 2.8)
PROJECT(cmake_test)
SET(SRC_LIST main.c)
INCLUDE_DIRECTORIES(/usr/include/glib)
MESSAGE(STATUS "This is BINARY dir "${HELLO_BINARY_DIR})
MESSAGE(STATUS "This is SOURCE dir "${HELLO_SOURCE_DIR})
ADD_EXECUTABLE(hello ${SRC_LIST})
(4)進入build目錄輸入 cmake ..

[cpp] view plain 在CODE上查看代碼片派生到我的代碼片
[email protected]:/home/cmake_test/build# cmake ..
若編譯成功在build目錄下會生成相應文件,其中有個makefile文件

有可能會出現問題:

CMAKE_CXX_COMPILER-NOTFOUND" was not found

解決方法:

[cpp] view plain 在CODE上查看代碼片派生到我的代碼片
[email protected]:/home/cmake_test/build# apt-get install g++
(可選)cmake -D CMAKE_CXX_COMPLIER=」g++」CMAKE -D CMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX:PATH=」/usr/local」
(5)輸入make 命令執行成功後在build目錄下會看到可執行的hello

(6)./hello

輸出 hello,this is my first usingcmake project。

註:這只適用於簡單的工程,若復雜的工程項目請參考www.cmake.org

❸ 怎麼配置cmakelist交叉編譯

cmake交叉編譯配置

很多時候,我們在開發的時候是面對嵌入式平台,因此由於資源的限制需要用到相關的交叉編譯。即在你host宿主機上要生成target目標機的程序。裡面牽扯到相關頭文件的切換和編譯器的選擇以及環境變數的改變等,我今天僅僅簡單介紹下相關CMake在面對交叉編譯的時候,需要做的一些准備工作。

CMake給交叉編譯預留了一個很好的變數CMAKE_TOOLCHAIN_FILE,它定義了一個文件的路徑,這個文件即toolChain,裡面set了一系列你需要改變的變數和屬性,包括C_COMPILER,CXX_COMPILER,如果用Qt的話需要更改QT_QMAKE_EXECUTABLE以及如果用BOOST的話需要更改的BOOST_ROOT(具體查看相關Findxxx.cmake裡面指定的路徑)。CMake為了不讓用戶每次交叉編譯都要重新輸入這些命令,因此它帶來toolChain機制,簡而言之就是一個cmake腳本,內嵌了你需要改變以及需要set的所有交叉環境的設置。

toolChain腳本中設置的幾個重要變數

1.CMAKE_SYSTEM_NAME:

即你目標機target所在的操作系統名稱,比如ARM或者Linux你就需要寫"Linux",如果Windows平台你就寫"Windows",如果你的嵌入式平台沒有相關OS你即需要寫成"Generic",只有當CMAKE_SYSTEM_NAME這個變數被設置了,CMake才認為此時正在交叉編譯,它會額外設置一個變數CMAKE_CROSSCOMPILING為TRUE.

2. CMAKE_C_COMPILER:

顧名思義,即C語言編譯器,這里可以將變數設置成完整路徑或者文件名,設置成完整路徑有一個好處就是CMake會去這個路徑下去尋找編譯相關的其他工具比如linker,binutils等,如果你寫的文件名帶有arm-elf等等前綴,CMake會識別到並且去尋找相關的交叉編譯器。

3. CMAKE_CXX_COMPILER:

同上,此時代表的是C++編譯器。

4. CMAKE_FIND_ROOT_PATH:

指定了一個或者多個優先於其他搜索路徑的搜索路徑。比如你設置了/opt/arm/,所有的Find_xxx.cmake都會優先根據這個路徑下的/usr/lib,/lib等進行查找,然後才會去你自己的/usr/lib和/lib進行查找,如果你有一些庫是不被包含在/opt/arm裡面的,你也可以顯示指定多個值給CMAKE_FIND_ROOT_PATH,比如

set(CMAKE_FIND_ROOT_PATH /opt/arm /opt/inst)

該變數能夠有效地重新定位在給定位置下進行搜索的根路徑。該變數默認為空。當使用交叉編譯時,該變數十分有用:用該變數指向目標環境的根目錄,然後CMake將會在那裡查找。

5. CMAKE_FIND_ROOT_PATH_MODE_PROGRAM:

對FIND_PROGRAM()起作用,有三種取值,NEVER,ONLY,BOTH,第一個表示不在你CMAKE_FIND_ROOT_PATH下進行查找,第二個表示只在這個路徑下查找,第三個表示先查找這個路徑,再查找全局路徑,對於這個變數來說,一般都是調用宿主機的程序,所以一般都設置成NEVER

6. CMAKE_FIND_ROOT_PATH_MODE_LIBRARY:

對FIND_LIBRARY()起作用,表示在鏈接的時候的庫的相關選項,因此這里需要設置成ONLY來保證我們的庫是在交叉環境中找的.

7. CMAKE_FIND_ROOT_PATH_MODE_INCLUDE:

對FIND_PATH()和FIND_FILE()起作用,一般來說也是ONLY,如果你想改變,一般也是在相關的FIND命令中增加option來改變局部設置,有NO_CMAKE_FIND_ROOT_PATH,ONLY_CMAKE_FIND_ROOT_PATH,BOTH_CMAKE_FIND_ROOT_PATH

8. BOOST_ROOT:

對於需要boost庫的用戶來說,相關的boost庫路徑配置也需要設置,因此這里的路徑即ARM下的boost路徑,裡面有include和lib。

9. QT_QMAKE_EXECUTABLE:

對於Qt用戶來說,需要更改相關的qmake命令切換成嵌入式版本,因此這里需要指定成相應的qmake路徑(指定到qmake本身)

toolChain demo

# this is required
SET(CMAKE_SYSTEM_NAME Linux)

# specify the cross compiler
SET(CMAKE_C_COMPILER /opt/arm/usr/bin/ppc_74xx-gcc)
SET(CMAKE_CXX_COMPILER /opt/arm/usr/bin/ppc_74xx-g++)

# where is the target environment
SET(CMAKE_FIND_ROOT_PATH /opt/arm/ppc_74xx /home/rickk/arm_inst)

# search for programs in the build host directories (not necessary)
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
# for libraries and headers in the target directories
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

# configure Boost and Qt
SET(QT_QMAKE_EXECUTABLE /opt/qt-embedded/qmake)
SET(BOOST_ROOT /opt/boost_arm)

這樣就完成了相關toolChain的編寫,之後,你可以靈活的選擇到底採用宿主機版本還是開發機版本,之間的區別僅僅是一條-DCMAKE_TOOLCHAIN_FILE=./toolChain.cmake,更爽的是,如果你有很多程序需要做轉移,但目標平台是同一個,你僅僅需要寫一份toolChain放在一個地方,就可以給所有工程使用。

❹ cmakelists.txt 怎麼編譯

./configure就是執行你當前目錄下一個名叫configure的腳本,由它生成Makefile,有了Makefile之後,一般來說就可以通過make進行編譯,make install進行安裝 cmake就是一個與make同級別的編譯工具,只不過它依靠的不是Makefile作為編譯規則

❺ 怎樣編寫Cmake的配置文件Cmakelist.txt

  1. Cmake 有linux ,windows 多個平台版本,如圖是windows下版本程序

    怎樣編寫Cmake的配置文件Cmakelist.txt

  2. 更具一個簡單多目錄c項目,學下cmakelist.txt編寫規范

  3. 根目錄下cmakelist文件內容:
    set(CMAKE_INSTALL_PREFIX):設置程序的安裝目錄,優先順序比cmake命令參數設置高。
    add_subdirectory(編譯文件子目錄)

  4. libhello 目錄下的cmakelist文件內容:

  5. libhello 目錄下的cmakelist文件內容:
    查看編譯後結果:

❻ 如何寫CMakeList.txt

這一章將從軟體開發者的角度來描述如何實用CMake。也就是說,如果你的目標是用CMake來管理你的生成過程,請閱讀這一章。

CMake的輸入

COMMAND(args)

這里的 COMMAND 是命令行的名稱,args是用空格分割的參數列表。典型的,對與每一個項目的目錄存在一個CMakeLists.txt。 下面我們將從一個簡單的Hello world例子開始介紹, 它的源代碼樹形文件包含這些文件:

Hello.c CMakeLists.txt

CMakeLists.txt將包含下面兩行:

PROJECT(Hello)
ADD_EXECUTABLE(Hello Hello.c)

為了生成Hello的可執行程序,你只需依照上面CMake運行的過程描述來生成makefiles文件。 PROJECT 命令表明了產生的工作空間的名稱。 ADD_EXECUTABLE命令添加可執行的目標到生成程序。這個簡單的程序就只需要這些設置。如歌你的項目需要一些文件才能編譯也很容易,只想修改ADD_EXECUTABLE命令行如下:

ADD_EXECUTABLE(Hello Hello.c File2.c File3.c File4.c)

ADD_EXECUTABLE只是很多CMake命令中的一種。比如更復雜的如下:

PROJECT(HELLO)
SET(HELLO_SRCS Hell.c File2.c File3.c)
IF(WIN32)
SET(HELLO_SRCS ${HELLO_SRCS} WinSupport.c)
ELSE (WIN32)
SET(HELLO_SRCS ${HELLO_SRCS} UnixSupport.c)
ENDIF (WIN32)

ADD_EXECUTABLE (Hello ${HELLO_SRCS})

#look for the Tcl library
FIND_LIBRARY(TCL_LIBRARY NAMES tcl tc184 tc183 tc 182 tc 180
PATHS /usr/lib /usr/local/lib)
IF (TCL_LIBRARY)
TARGET_ADD_LIBRARY (Hello TCL_LIBRARY)
ENDIF(TCL_LIBRARY)

在這個例子中 SET 命令用於將源文件組成一個列表。 IF 命令用於增加WinSupport.c或者UnixSupport.c到列表中。 最後 ADD_EXECUTABLE 命令用於 採用源文件列表HELLO_SRCS中列出的文件 生成可執行文件。FIND_LIBRARY命令用於尋找在一些指定目錄下的特定的Tcl庫文件。如果找到了,就將他們添加到Hello可執行程序的鏈接命令。 #行為注釋行。

CMake 是會定義一些使用的變數在CMakeList文件中。 比如,WIN32總是會在windows系統中被定義,而UNIX
總是在UNIX系統中被定義。

生成目標:(Build Targets)

SET()
SUBDIRS()
ADD_LIBRARY()
這里生成靜態鏈接文件,例如ADD_LIBRARY(Whole ${HELLO_SRC}),就會生成一個libWhole.a可供鏈接

ADD_EXECUTABLE()
AUX_SOURCE_DIRECTORY()
PROJECT()

CMake會循環的查找從當前目錄到SUBDIRS列出的任何子目錄的文件。SET命令用於設定一個變數。ADD_LIBRARY將添加一個庫到目標之中。 ADD_EXECUTABLE添加一個可執行程序到目標列表中。(Note:編譯器執行的順序是先編譯源文件,然後生成庫文件,最後生成可執行文件)。AUX_SOURCE_DIRECTORY表示一個不在當前目錄的包含源文件的目錄。這些源代碼將插入當前的庫(LIBRARY)中。所有在AUX_SOURCE_DIRECTORY的文件將被編譯(如,*.c,*.cxx,*.cpp等等)。PROJECT(ProjectName)是一個用在MSVC中的特殊變數,用於為編譯器生成項目。他也為CMAKE定義連個有用的變數:ProjectName_SOURCE_DIR和ProjectName_BINARY_DIR.

編譯的標示和選項。除了上面列出的命令外,CMakeLists.txt還包含如下的命令:
INCLUDE_DIRECTORIES()
LINK_DIRECTORIES()
LINK_LIBRARIES()
TARGET_LINK_LIBRARIES()

這些命令定義了用於編譯源代碼和生成可執行程序的目錄和庫。上面列出的目錄的一個很重要的特性是它們會被任何子目錄繼承。也就是說,CMake依照目錄的分層結構來承襲這些命令。在每次遇到對這些命令的描述的時候都會被展開一次。比如說,如果在頂層的CMakeLists文件中有定義INCLUDE_DIRECTORIES(/usr/include)和SUBDIRS(./subdir1),並且在./subdir1/CMakeLists.txt有INCLUDE_DIRECTORIES(/tmp/foobar),於是最後網狀的結果是
INCLUDE_DIRECTORIES(/usr/include /tmp/foobar)

CMake會定義許多的模塊來查找通常會用到的包,比如OpenGL或Java。 這些模塊為你節省了很多的時間來編寫這些查找包。這些模塊可以像這樣加到你的CMakeList文件中,如下:

INCLUDE(${CMAKE_ROOT}/Moles/FindTCL.cmake)

CMAKE_ROOT 總是定義在CMake中,用於指向CMake安裝的路徑。查看Moles子目錄下的一些文件可以給你提供一些很好的idea關於怎樣用這些CMake命令。

給項目文件添加一個新的目錄
一個通用的方法來擴展一個項目文件是給他添加一個新的文件夾。這將包含三個步驟:
1.創建一個新的目錄在你的源代碼的分層目錄中
2.將這個新的目錄添加到SUBDIRS命令中
3.在這個新創建的目錄中用適當的命令建立一個CMakeLists.txt文件

This section describes how to use CMake from the software developer's point of view. That is, if your aim is to use CMake to manage your build process, read this section first.
Input to CMake

COMMAND(args)
Where COMMAND is the name of the command, and args is a white-space separated list of arguments to the command. (Arguments with embedded white-space should be quoted.) Typically there will be a CMakeLists.txt file for each directory of the project. Let's start with a simple example. Consider building hello world. You would have a source tree with the following files:
Hello.c CMakeLists.txt
The CMakeLists.txt file would contain two lines:
PROJECT (Hello)
ADD_EXECUTABLE(Hello Hello.c)
To build the Hello executable you just follow the process described in Running CMake above to generate the makefiles or Microsoft project files. The PROJECT command indicates what the name of the resulting workspace should be and the ADD_EXECUTABLE command adds an executable target to the build process. That's all there is to it for this simple example. If your project requires a few files it is also quite easy, just modify the ADD_EXECUTABLE line as shown below.
ADD_EXECUTABLE(Hello Hello.c File2.c File3.c File4.c)

ADD_EXECUTABLE is just one of many commands available in CMake. Consider the more complicated example below.

PROJECT (HELLO)
SET(HELLO_SRCS Hello.c File2.c File3.c)
IF (WIN32)
SET(HELLO_SRCS ${HELLO_SRCS} WinSupport.c)
ELSE (WIN32)
SET(HELLO_SRCS ${HELLO_SRCS} UnixSupport.c)
ENDIF (WIN32)
ADD_EXECUTABLE (Hello ${HELLO_SRCS})

# look for the Tcl library
FIND_LIBRARY(TCL_LIBRARY NAMES tcl tcl84 tcl83 tcl82 tcl80
PATHS /usr/lib /usr/local/lib)
IF (TCL_LIBRARY)
TARGET_ADD_LIBRARY (Hello TCL_LIBRARY)
ENDIF (TCL_LIBRARY)
In this example the SET command is used to group together source files into a list. The IF command is used to add either WinSupport.c or UnixSupport.c to this list. And finally the ADD_EXECUTABLE command is used to build the executable with the files listed in the source list HELLO_SRCS. The FIND_LIBRARY command looks for the Tcl library under a few different names and in a few different paths, and if it is found adds it to the link line for the Hello executable target. Note the use of the # character to denote a comment line.
CMake always defines some variables for use within CMakeList files. For example, WIN32 is always defined on windows systems and UNIX is always defined for UNIX systems. CMake defines a number of commands. A brief summary of the most commonly used commands follows here. Later in the document an exhaustive list of all pre-defined commands is presented. (You may also add your own commands, see the Extension Guide for more information.)

Build Targets:

SET()
SUBDIRS()
ADD_LIBRARY()
這里生成靜態鏈接文件,例如ADD_LIBRARY(Whole ${HELLO_SRC}),就會生成一個libWhole.a,可供鏈接。

ADD_EXECUTABLE()
AUX_SOURCE_DIRECTORY()
PROJECT()
CMake works recursively, descending from the current directory into any subdirectories listed in the SUBDIRS command. The command SET is used for setting a variable, in this case to a list of source files. (Note: currently only C and C++ code can be compiled.) ADD_LIBRARY adds a library to the list of targets this makefile will proce. ADD_EXECUTABLE adds an executable to the list of targets this makefile will proce. (Note: source code is compiled first, then libraries are built, and then executables are created.) The AUX_SOURCE_DIRECTORY is a directory where other source code, not in this directory, whose object code is to be inserted into the current LIBRARY. All source files in the AUX_SOURCE_DIRECTORY are compiled (e.g. *.c, *.cxx, *.cpp, etc.). PROJECT (PojectName) is a special variable used in the MSVC to create the project for the compiler, it also defines two useful variables for CMAKE: ProjectName_SOURCE_DIR and ProjectName_BINARY_DIR.

Build flags and options. In addition to the commands listed above, CMakeLists.txt often contain the following commands:

INCLUDE_DIRECTORIES()
LINK_DIRECTORIES()
LINK_LIBRARIES()
TARGET_LINK_LIBRARIES()
These commands define directories and libraries used to compile source code and build executables. An important feature of the commands listed above is that are inherited by any subdirectories. That is, as CMake descends through a directory hierarchy (defined by SUBDIRS()) these commands are expanded each time a definition for a command is encountered. For example, if in the top-level CMakeLists file has INCLUDE_DIRECTORIES(/usr/include), with SUBDIRS(./subdir1), and the file ./subdir1/CMakeLists.txt has INCLUDE_DIRECTORIES(/tmp/foobar), then the net result is
INCLUDE_DIRECTORIES(/usr/include /tmp/foobar)
CMake comes with a number of moles that look for commonly used packages such as OpenGL or Java. These moles save you from having to write all the CMake code to find these packages yourself. Moles can be used by including them into your CMakeList file as shown below.

INCLUDE (${CMAKE_ROOT}/Moles/FindTCL.cmake)
CMAKE_ROOT is always defined in CMake and can be used to point to where CMake was installed. Looking through some of the files in the Moles subdirectory can provide good ideas on how to use some of the CMake commands.

Adding A New Directory to a project

A common way to extend a project is to add a new directory. This involves three steps:
Create the new directory somewhere in your source directory hierarchy.
Add the new directory to the SUBDIRS command in the parent directories CMakeLists.txt
Create a CMakeLists.txt in the new directory with the appropriate commands

❼ linux的CmakeList.txt怎麼寫解決多線程喚起同一個文件(多次)

CMake是一個跨平台的安裝(編譯)工具,可以用簡單的語句來描述所有平台的安裝(編譯過程)。他能夠輸出各種各樣的makefile或者project文件,能測試編譯器所支持的C++特性,類似UNIX下的automake。只是 CMake 的組態檔取名為 CmakeLists.txt。Cmake 並不直接建構出最終的軟體,而是產生標準的建構檔(如 Unix 的 Makefile 或 Windows Visual C++ 的 projects/workspaces),然後再依一般的建構方式使用。這使得熟悉某個集成開發環境(IDE)的開發者可以用標準的方式建構他的軟體,這種可以使用各平台的原生建構系統的能力是 CMake 和 SCons 等其他類似系統的區別之處。CMake 可以編譯源代碼、製作程式庫、產生適配器(wrapper)、還可以用任意的順序建構執行檔。CMake 支持 in-place 建構(二進檔和源代碼在同一個目錄樹中)和 out-of-place 建構(二進檔在別的目錄里),因此可以很容易從同一個源代碼目錄樹中建構出多個二進檔。CMake 也支持靜態與動態程式庫的建構。

❽ CmakeLists.txt里如何設置編譯線程的數量類似-j6

專門用來編譯mkdir buildcd build二、cmake指向CMakeLists.txt所在的目錄,例如cmake... 至於怎麼淘汰,這里不說,但是畢竟是淘汰機制

❾ OSX系統用QT編譯cmakelist文件時出錯 在這無限循環

Qt在編譯時,需要首先使用uic.exe編譯UI文件,通過moc.exe處理Q_OBJECT之類的宏,當然你可以去掉這些定義,否則就需要加上:#COMPILEUIsSET(UISmnwindow)FOREACH(ui_file${UIS})SET(TMP_IN"${PROJECT_SOURCE_DIR}/res/${ui_file}.ui")SET(TMP_OUT"${PROJECT_BINARY_DIR}/ui_${ui_file}.h")EXECUTE_PROCESS(COMMAND${QT_FOLDER}/bin/uic.exe-o${TMP_OUT}${TMP_IN})MESSAGE(STATUS"EXEC=${QT_FOLDER}/bin/uic.exe-o${PROJECT_BINARY_DIR}/ui_${ui_file}.h${PROJECT_SOURCE_DIR}/res/${ui_file}.ui")ENDFOREACH(ui_file)#CREATEMOCSET(HEADERSmainwindow)FOREACH(header_file${HEADERS})SET(TMP_IN"${PROJECT_SOURCE_DIR}/inc/${header_file}.h")SET(TMP_OUT"${PROJECT_BINARY_DIR}/moc_${header_file}.cpp")EXECUTE_PROCESS(COMMAND${QT_FOLDER}/bin/moc.exe-o${TMP_OUT}${TMP_IN})SET(MOCS${MOCS}${PROJECT_BINARY_DIR}/moc_${header_file}.cpp)MESSAGE(STATUS"EXEC=${QT_FOLDER}/bin/moc.exe-o${PROJECT_BINARY_DIR}/moc_${header_file}.cpp${PROJECT_SOURCE_DIR}/inc/${header_file}.h")ENDFOREACH(header_file)freec#.netqrcreator這里要注意的是:EXECUTE_PROCESS在COMMAND後面不能加引號,命令直接寫,否則執行的程序也不會出錯,但也不會正常運行.

熱點內容
一台伺服器主機帶好多台電腦 發布:2022-08-19 15:36:47 瀏覽:782
資料庫關系除法 發布:2022-08-19 15:35:14 瀏覽:78
android3g開發 發布:2022-08-19 15:31:52 瀏覽:124
安卓微信動態封面怎麼設置 發布:2022-08-19 15:31:49 瀏覽:676
如何用win7配置web伺服器 發布:2022-08-19 15:31:47 瀏覽:970
如何查詢一台伺服器的地址 發布:2022-08-19 15:27:49 瀏覽:81
多表查詢的php 發布:2022-08-19 15:26:10 瀏覽:259
dll反編譯c 發布:2022-08-19 15:26:05 瀏覽:305
校內資料庫 發布:2022-08-19 15:21:56 瀏覽:224
咪咕閱讀不給存儲許可權會如何 發布:2022-08-19 15:21:50 瀏覽:946