)


首頁 資料庫 mysql教程 qtopia2.2.0编译成功,分享一下经验

qtopia2.2.0编译成功,分享一下经验

Jun 07, 2016 pm 03:26 PM
一下 分享 成功 經驗 編譯

经过一段漫长而痛苦的过程(几次差点就要放弃)之后,今天 qtopia 2.2.0pc版本和 ARM - LINUX 版本都终于 编译 成功 了,下面我和大家分享一下pc机版本的qtopia2.2.0编译过程中的遇到的错误及其 解决 办法,希望与大家一起进步。(arm-linux版本的编译参照

经过一段漫长而痛苦的过程(几次差点就要放弃)之后,今天qtopia2.2.0pc版本和ARM-LINUX版本都终于编译成功了,下面我和大家分享一下pc机版本的qtopia2.2.0编译过程中的遇到的错误及其解决办法,希望与大家一起进步。(arm-linux版本的编译参照飞凌提供的6410的qt移植视频中的五和六,先编译第三方库,按照视频上来就没有问题,编译完第三方库以后,剩下的就和pc版本的相差无几了)

环境ubuntu10.10   
编译器: gcc version 4.4.5  
主机:奔四   
内存:512+256M    
VMware版本:7.0

注意事项:
     在编译之前先确保你的ubuntu系统中有X11的SDK库,Qtopia编译过程中需要使用X11SDK里面的一些头文件,使用以下命令,即可完成安装:    
     apt-get install libx11-dev libxext-dev libxtst-dev

   另外,在修改完第一处错误,重新编译之前,先修改一下build脚本文件,因为重新执行build命令,该脚本会把刚才编译中的qtopia-free-2.2.0文件夹删除,重新解压,形成新的qtopia-free-2.2.0,开始编译,这样刚才的修改就失去意义了。修改build脚本的方法如下:
      将  rm -fr qtopia-free-2.2.0
          tar xfvz qtopia-free-2.2.0.tar.gz 这两条语句的前面分别加上#  ,注释掉,保存退出,重新执行  ./build


在编译过程中会出现很多的错误,包括飞凌提供的ok6410 QT移植百科全书里面的,但是手册里面罗列的不全,下面我将我在编译过程实际遇到的编译错误及其解决办法写一下(其中的一些错误实际中没有遇到,是从网上搜集的,供朋友们参考):
  
  错误一:
        /usr/bin/ld: cannot find -lXmu
        collect2: ld returned 1 exit status
  错误二:
         Creating pngscale...make[1]: Entering directory `/root/yizhi/qtopia-free-2.2.0/qtopia/util/pngscale'
..make[1]: *** [../../bin/pngscale] Error 1
make[1]: Leaving directory `/root/yizhi/qtopia-free-2.2.0/qtopia/util/pngscale'
Failed to make pngscale
    分析:
         这是因为没有安装uuid和Xmu,因为在编译qtopia2.2.0的过程中需要安装工具uuid(Universally Unique Identifier,)和 xmu库文件。
    解决办法:
            
           apt-get install  uuid-dev 
           apt-get install libxmu-dev libxmu6

错误三:
      external/clearsilver/cgi/cgi.c:22: fatal error: zlib.h: No such file or directory
       compilation terminated.
      make: *** [out/host/linux-x86/obj/SHARED_LIBRARIES/libneo_cgi_intermediates/cgi.o] Error 1

  解决:
        在ubuntu里,zlib叫zlib1g,相应的zlib-devel叫zlib1g.dev

        sudo apt-get install zlib1g-dev

错误四:
      /usr/bin/ld: cannot find -lz
      collect2: ld returned 1 exit status
      make: *** [out/host/linux-x86/obj/EXECUTABLES/aapt_intermediates/aapt] Error 1

   解决方法:
       sudo apt-get install lib32z1-dev

错误五:
     bison -d  -o out/host/linux-x86/obj/EXECUTABLES/aidl_intermediates/aidl_language_y.cpp      frameworks/base/tools/aidl/aidl_language_y.y
     /bin/bash: bison: command not found
     make: *** [out/host/linux-x86/obj/EXECUTABLES/aidl_intermediates/aidl_language_y.cpp] Error 127

    解决方法:
     sudo apt-get install bison

错误六:
      Lex: aidl       /bin/bash: flex: command not found
      make: *** [out/host/linux-x86/obj/EXECUTABLES/aidl_intermediates/aidl_language_l.cpp] Error 127

    解决方法:
      sudo apt-get install flex
            
错误七:
      /usr/bin/ld: cannot find -lncurses
      collect2: ld returned 1 exit status
     make: *** [out/host/linux-x86/obj/EXECUTABLES/adb_intermediates/adb] Error 1

解决方法:
     sudo apt-get install lib32ncurses5-dev

错误八:
    prebuilt/linux-x86/sdl/include/SDL/SDL_syswm.h:55: fatal error: X11/Xlib.h: No such file     or directory
    compilation terminated.
    make: *** [out/host/linux-x86/obj/EXECUTABLES/emulator_intermediates/android/main-common.o] Error 1

解决方法:
    sudo apt-get install libx11-dev 


错误九:
     sh: gperf: not found
     calling gperf failed: 32512 at ./makeprop.pl line 96.
     make: ***  [out/target/product/generic/obj/STATIC_LIBRARIES/libwebcore_intermediates/WebCore/css/CSSPropertyNames.h] Error 25
make: *** Deleting file `out/target/product/generic/obj/STATIC_LIBRARIES/libwebcore_intermediates/WebCore/css/CSSPropertyNames.h'

解决方法:
     sudo apt-get install gperf 

错误十:open函数参数不够  

    /usr/include/bits/fcntl2.h:51: error: call to ‘__open_missing_mode’ declared with attribute error: open   with O_CREAT in second argument needs 3 arguments

  解决办法:
     参见ok6410移植百科全书。

错误十一:使用未定义的类
  
     error: ‘QWSInputMethod’ has not been declared
  解决办法:
       参见ok6410移植百科全书。 (注: 该文件中使用了这两个类,C++允许在文件中这样声明其他地方定义的类,减少头文件的相互包含关系,加快编译速度)


错误十二:缺少头文件
        asm/page.h: No such file or directory
  解决办法:
        参见ok6410移植百科全书。


错误十三:类型转换错误
      home/work/armqt/qtlibsource/qt-x11/include/qvalue stack.h: In member function 'T QValueStack::pop() [with T = QMap]': 
xml/qxml.cpp:513:   instantiated from here 
  /home/work/armqt/qtlibsource/qt-x11/include/qvalue stack.h:57: 错误:不能从'QValueListIterator >'转换到'const char*',为实参'1'(属于'int remove(const char*)') 
/home/work/armqt/qtlibsource/qt-x11/include/qvalue stack.h: In member function 'T QValueStack::pop() [with T = QString]': 
xml/qxml.cpp:2502:   instantiated from here 
  /home/work/armqt/qtlibsource/qt-x11/include/qvalue stack.h:57: 错误:不能从'QValueListIterator'转换到'const char*',为实参'1'(属于'int remove(const char*)')
    解决办法:
         参见ok6410移植百科全书。

错误十四:没有找到uic工具  错误提示:

    make[5]: /root/yizhi/host/qtopia-free-2.2.0/qt2/bin/uic: Command not found
    make[5]: *** [../../../include/qtopia/private/passwordbase_p.h] Error 127
   解决办法:
         cd到你的qtopia-free-2.2.0目录下, find ./  -name uic 会看到其他的目录下已经有了uic,我把qt3/bin 目录下的uic拷贝到 qt2/bin下面,即可 
       (注:我在实际操作过程中,一开始报出这个错误,但是将其他的错误改完之后,这个错误也就自动消失了,我是菜鸟,不知道怎么回事,qtopia2.2.0编译成功,分享一下经验 )


错误十五: 指针类型转换出错:
  backend/vobject.cpp: In function ‘VObject* addGroup(VObject*, const char*)’:
  backend/vobject.cpp:419: error: invalid conversion from ‘const char*’ to ‘char*’
  backend/vobject.cpp: In function ‘void writeEncString(OFi

解决办法:
  修改 qtopia-free-2.2.0/qtopia/src/libraries/qtopia/backend/vobject.cpp 文件419行
   char *dot = strrchr(g,'.');    修改为 char *dot = (char *)strrchr(g,'.');



在编译过程中还出现了类似的错误
     wavplugin.cpp:435 : error: invalid conversion from 'const char*' to 'char*'
   解决办法
        修改qtopia-free-2.2.0/qtopia/src/plugins/codes/wavplugin/wavplugin.cpp文件的第435行
       修改方法如上


错误十六:编译器找不到QSizePolicy类的五个参数的构造函数

   ui/release-shared/passwordbase_p.cpp:35: error: no matching function for call to ‘QSizePolicy:qtopia2.2.0编译成功,分享一下经验SizePolicy(QSizePolicy::SizeType, QSizePolicy::SizeType, int, int, bool)’
/root/yizhi/host/qtopia-free-2.2.0/qt2/include/qsizepolicy.h:93: note: candidates are: QSizePolicy:qtopia2.2.0编译成功,分享一下经验SizePolicy(int)
/root/yizhi/host/qtopia-free-2.2.0/qt2/include/qsizepolicy.h:99: note:                 QSizePolicy:qtopia2.2.0编译成功,分享一下经验SizePolicy(QSizePolicy::SizeType, QSizePolicy::SizeType, bool)
/root/yizhi/host/qtopia-free-2.2.0/qt2/include/qsizepolicy.h:63: note:                 QSizePolicy:qtopia2.2.0编译成功,分享一下经验SizePolicy()
/root/yizhi/host/qtopia-free-2.2.0/qt2/include/qsizepolicy.h:46: note:                 QSizePolicy:qtopia2.2.0编译成功,分享一下经验SizePolicy(const QSizePolicy  & )

   解决办法:

    qtopia-free-2.2.0/qtopia/src/libraries/qtopia/.ui/release-shared/passwordbase_p.cpp 文件中的38行位置
    prompt = new QLabel( this, "prompt" );
    prompt->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)1, 0, 0, prompt->sizePolicy().hasHeightForWidth() ) );

  修改为:

    prompt = new QLabel( this, "prompt" );
    prompt->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)1, prompt->sizePolicy  ().hasHeightForWidth() ) );

  即去掉0,0 两个参数 


错误十七(这是一大类错误,在编译过程中会遇到很多):g++编译器提示 有多余的符号在成员函数前 ,有些编译器规定C++成员函数前不需要再加这个类的名字

    thumbnailview_p.h: At global scope:
thumbnailview_p.h:81: error: extra qualification ‘ThumbnailItem::’ on member ‘paintItem’
make[5]: *** [.obj/release-shared/imageselector.o] Eopia/src

  解决办法 :

      qtopia-free-2.2.0/qtopia/src/libraries/qtopia2/thumbnailview_p.h文件中第81行:

    修改 void ThumbnailItem::paintItem( QPainter*, const QColorGroup& ); 

    修改后  void  paintItem( QPainter*, const QColorGroup& ); 

  ** 继续编译后会出现类似的错误

abtable_p.h:276: error: extra qualification ‘PhoneTypeSelector::’ on member ‘addType’
make[5]: *** [.obj/release-shared/abtable.o] Error 1
make[5]: Leaving directory `/root/yizhi/host/qtopia-free-2.2.0/qtopia/src/libraries/qtopiapim'
make[4]: *** [all] Error 2
    解决办法:去掉 PhoneTypeSelector::

继续编译:
     ../../../include/qtopia/pim/private/../../../../src/libraries/qtopiapim/numberentry_p.h: At global scope:
../../../include/qtopia/pim/private/../../../../src/libraries/qtopiapim/numberentry_p.h:106: error: extra qualification ‘NumberEntryDialog::’ on member ‘eventFilter’
make[5]: *** [.obj/release-shared/numberentry.o] Error 1
make[5]: Leaving directory `/root/yizhi/host/qtopia-free-2.2.0/qtopia/src/libraries/qtopiapim'
make[4]: *** [all] Error 2

解决办法:去掉NumberEntryDialog::’

继续编译
  In file included from addressbook.cpp:40:
ablabel.h: At global scope:
ablabel.h:78: error: extra qualification ‘AbLabel::’ on member ‘decodeHref"

解决办法:去掉‘AbLabel::’

 

继续编译
  In file include from minefiled.cpp:35
  minefiled.h:105: error: extra qualification 'MineFiled::' on member
  'setState'
  minefiled.h:106: error: extra qualification 'MineFiled::' on member
  'placeMines'

解决办法:
      编辑 qtopia-free-2.2.0/qtopia/src/games/minesweep/minefiled.h
     修改106行和105行:  删除'MineFiled::'即可


继续编译
     buttoneditordialog.h:56 error:extra qualification 'ButtonEditorDialog::' on member
    'actionFor'
   解决办法:
       编辑qtopia-free-2.2.0/qtopia/src/settings/buttoneditor/buttoneditordialog.h
     将'ButtonEditorDialog::' 删除即可



继续编译
     出现packagewizard.h:106:error: extra qualification 'PackageWizard::' on member
    'current'
    解决办法
       编辑qtopia-free-2.2.0/qtopia/src/settings/qipkg/packagewizard.h
       将'PackageWizard::'删除即可

继续编译
    出现  keboard.h:60 error:extra qualification 'KeboardPicks::' on member
    'KeboardPicks'
    解决办法
       编辑qtopia-free-2.2.0/qtopia/src/plugins/inputmethods/keyboard/keyboard.h
       将第60行的'KeboardPicks::'删除即可

继续编译
      还会出现类似的错误,如extra qualification 'PolishedDecoration::' 、'IMToolButton::'



错误十八:未经定义的构造函数错误提示

.ui/release-shared/emaildlg.cpp: In constructor ‘EmailDialogBase::EmailDialogBase(QWidget*, const char*, bool, uint)’:
.ui/release-shared/emaildlg.cpp:65: error: no matching function for call to ‘QSizePolicy:qtopia2.2.0编译成功,分享一下经验SizePolicy(QSizePolicy::SizeType, QSizePolicy::SizeType, int, int, bool)’
/root/yizhi/host/qtopia-free-2.2.0/qt2/include/qsizepolicy.h:93: note: candidates are: QSizePolicy:qtopia2.2.0编译成功,分享一下经验SizePolizePolicj4

     修改  qtopia-free-2.2.0/qtopia/src/applications/addressbook/.ui/release-shared/emaildlg.cpp  文件第65行
   
    okButton = new QPushButton( this, "okButton" );
    okButton->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)3, (QSizePolicy::SizeType)0, 0, 0, okButton->sizePolicy().hasHeightForWidth() ) );
    Layout2->addWidget( okButton );

    cancelButton = new QPushButton( this, "cancelButton" );
    cancelButton->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)3, (QSizePolicy::SizeType)0, 0, 0, cancelButton->sizePolicy().hasHeightForWidth() ) );
    Layout2->addWidget( cancelButton );

  修改为


okButton = new QPushButton( this, "okButton" );
    okButton->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)3, (QSizePolicy::SizeType)0,okButton->sizePolicy().hasHeightForWidth() ) );
    Layout2->addWidget( okButton );

    cancelButton = new QPushButton( this, "cancelButton" );
    cancelButton->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)3, (QSizePolicy::SizeType)0,cancelButton->sizePolicy().hasHeightForWidth() ) );
    Layout2->addWidget( cancelButton );

继续编译:

    错误提示:.ui/release-shared/camerabase.cpp:41: error: no matching function for call to ‘QSizePolicy:qtopia2.2.0编译成功,分享一下经验SizePolicy(QSizePolicy::SizeType, QSizePolicy::SizeType, int, int, bool)’
/root/yizhi/host/qtopia-free-2.2.0/qt2/include/qsizepolicy.h:93: note: candidates are: QSizePolicy:qtopia2.2.0编译成功,分享一下经验SizePolicy(int)

   解决办法: 

     编辑  qtopia-free-2.2.0/qtopia/src/applications/camera/.ui/release-shared/camerabase.cpp 文件的第41行

videocaptureview->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)7, 0, 0, videocaptureview->sizePolicy().hasHeightForWidth() ) );

修改为:

videocaptureview->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)7, videocaptureview->sizePolicy().hasHeightForWidth() ) );




下面将网上搜集的另外一点资料贴上:

1. Could not find wxWidgets library. 

Solution: $sudo apt-get install libwxgtk2.8-0 libwxgtk2.8-dev wx2.8-headers wx-common 

2. Need libsmbclient.h for compiling on Unix. 

Solution: $sudo apt-get install libsmbclient-dev 

3. Need cups.h for compiling on Unix. 

Solution: $sudo apt-get install libcupsys2-dev 

4. error: Need opensc/opensc.h. 

Solution: $sudo apt-get install libopensc2-dev 

5. exec: g++: not found. 

Solution: $sudo apt-get install build-essential 

6. error: X11/Xlib.h: no such file or directory. 

Solution: $sudo apt-get install libx11-dev 

7. error: X11/Xmu/WinUtil.h: no such file or directory. 

Solution: $sudo apt-get install libxmu-dev 

8. error: jpeglib.h: no such file or directory. 

Solution: $sudo apt-get install libjpeg-dev 

9. error: png.h: no such file or directory. 

Solution: $sudo apt-get install libpng-dev

   大体上能够遇到的错误差不多就这几种类型,关键是哪里出错去哪里找,然后进入那个路径,修改相应的错误,希望类似我这样的初学者朋友戒浮忌躁,相信大家都会成功的。

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1653
14
CakePHP 教程
1413
52
Laravel 教程
1304
25
PHP教程
1251
29
C# 教程
1224
24
夸克網盤怎麼分享到百度網盤? 夸克網盤怎麼分享到百度網盤? Mar 14, 2024 pm 04:40 PM

  夸克網盤和百度網盤都是很便利的儲存工具,不少的用戶都在詢問這兩款軟體互通嗎?夸克網盤怎麼分享到百度網盤?下面就讓本站來為用戶們來仔細的介紹一下夸克網盤的文件怎麼保存到百度網盤方法吧。夸克網盤的文件怎麼保存到百度網盤方法1、想要知道怎麼把夸克網盤的文件轉到百度網盤,首先在夸克網盤上下載需要保存的文件,然後打開百度網盤客戶端後,選擇壓縮檔案要儲存的資料夾,雙擊開啟該資料夾。  2、開啟該資料夾後,點選視窗左上角區域的「上傳」。  3、在電腦中找到需要上傳的壓縮文件,點選選

C++編譯報錯:未宣告的標識符,如何解決? C++編譯報錯:未宣告的標識符,如何解決? Aug 22, 2023 pm 03:34 PM

在使用C++進行程式設計時,經常會遇到未宣告的識別碼這個問題。這種情況通常發生在使用了未定義的變數、函數或類別時,導致編譯器無法識別這些標識符,進而產生編譯錯誤。本文將介紹導致未聲明的標識符問題的常見原因以及如何解決這個問題。常見原因未宣告的標識符問題通常由以下幾種原因導致:變數、函數或類別未被正確聲明:在使用變數、函數或類別之前,應該先聲明它們。如果變數未被宣告或函

網路易雲音樂怎麼分享到微信朋友圈_網易雲音樂分享到微信朋友圈教程 網路易雲音樂怎麼分享到微信朋友圈_網易雲音樂分享到微信朋友圈教程 Mar 25, 2024 am 11:41 AM

1.首先我們進入到網易雲音樂中,然後在軟體首頁介面中,點選進入到歌曲的播放介面中。 2.然後在歌曲播放介面中,找到右上方的分享功能按鈕,如下圖紅框所示位置,點擊選擇分享的管道;在分享管道中,點擊底部的「分享至」選項,然後選擇第一個“微信朋友圈”,即可將內容分享至微信朋友圈。

百度網盤怎麼分享文件給好友 百度網盤怎麼分享文件給好友 Mar 25, 2024 pm 06:52 PM

近期,百度網盤安卓客戶端迎來了全新的8.0.0版本,這個版本不僅帶來了許多變化,還增添了許多實用功能。其中,最引人注目的便是資料夾共享功能的增強。現在,使用者可以輕鬆邀請好友加入,共同分享工作與生活中的重要文件,實現更便利的協作與分享。那麼究竟該如何分享給好友自己需要分享的文件呢,下文中本站小編就會為大家帶來詳細內容介紹,希望能幫助大家! 1)開啟百度雲APP,先點選在首頁選擇相關的資料夾,再點選介面右上角的【...】圖示;(如下圖)2)接著點選「共用成員」一欄中的【+ 】,最後在勾選所

芒果tv會員帳號分享2023 芒果tv會員帳號分享2023 Feb 07, 2024 pm 02:27 PM

芒果TV擁有各種類型的電影、電視劇、綜藝等資源,用戶可以在其中自由的選擇觀看。芒果tv會員不僅能夠看到全部的VIP劇而且還能夠設定最高清的畫質,幫助用戶爽快看劇,下面小編就給大家帶來一些芒果tv免費的會員帳號供用戶們使用,趕緊來看一看吧。芒果tv最新會員帳號免費分享2023:注意:都是收集的最新會員帳號,可以直接登入使用,不要隨意的修改密碼。帳號:13842025699密碼:qds373帳號:15804882888密碼:evr6982帳號:13330925667密碼:jgqae帳號:1703

解決Discuz微信分享無法顯示的問題 解決Discuz微信分享無法顯示的問題 Mar 09, 2024 pm 03:39 PM

標題:解決Discuz微信分享無法顯示的問題,需要具體程式碼範例隨著行動網路的發展,微信成為了人們日常生活中不可或缺的一部分。在網站開發中,為了提升使用者體驗和擴大網站的曝光度,許多網站會整合微信分享功能,讓使用者能夠輕鬆分享網站的內容到朋友圈或微信群組。然而,有時在使用Discuz等開源論壇系統時,會遇到微信分享無法顯示的問題,這給使用者體驗帶來了一定的困

如何分享ppt 如何分享ppt Mar 20, 2024 pm 07:51 PM

職場人士對PPT製作不會太陌生吧,因為不管是年終總結還是述職報告很多公司都要求用PPT的形式來體現。此時就遇到一個問題,那就是如何分享PPT呢?不要急,下面小編帶大家了解分享PPT的方法。 1.先選擇編輯好的PPT,點選左上角的儲存(如果使用的是WPS,可以先點選登入)。 2.接著點擊下圖選單列的分享圖標,如下圖所示。 3、然後會彈出下圖的分享介面,可以看到會出現一個分享鏈接,點擊發送鏈接即可分享。 4.還可以點擊下圖左下角的“允許好友編輯”,這樣好友也可以點擊編輯這個PPT了。 5.如果需要給P

PHP開發心得分享:掌握各種功能實現的經驗與建議 PHP開發心得分享:掌握各種功能實現的經驗與建議 Nov 22, 2023 pm 12:02 PM

在當前網路高速發展的時代,PHP作為一種伺服器端腳本語言,被越來越多的開發者所採用。 PHP具有簡單易學、靈活、開源免費等優勢,可快速開發各種網站和Web應用。然而,身為PHP開發者,要想在激烈的競爭中脫穎而出並寫出高效穩定的程式碼,還需要掌握各種功能的實現技巧和經驗。首先,合理規劃專案架構是開發PHP應用的關鍵。一個良好的專案架構可以提供更好的程式碼可維

See all articles