如果你安裝的是VC6.0,那麼就要自己配置一下
環境變數
第一步:設置環境變數。我的電腦,
右擊
,->
屬性
->高級->環境變數
->新建
變數名:include
值:E:\Program
Files\Microsoft
Visual
Studio\VC98\atl\include;E:\Program
Files\Microsoft
Visual
Studio\VC98\mfc\include;E:\Program
Files\Microsoft
Visual
Studio\VC98\include
變數名:lib
值:E:\Program
Files\Microsoft
Visual
Studio\VC98\mfc\lib;E:\Program
Files\Microsoft
Visual
Studio\VC98\lib
這個值是你自己的C++的安裝目錄。
變數名:PATH(這個不用新建的)
值:在以前的值後面加上;E:\Program
Files\Microsoft
Visual
Studio\Common\Tools\WinNT;E:\Program
Files\Microsoft
Visual
Studio\Common\MSDev98\Bin;E:\Program
Files\Microsoft
Visual
Studio\Common\Tools;E:\Program
Files\Microsoft
Visual
Studio\VC98\bin然後就可以調用cl命令編譯,至於cl命令各參數的意義,你可以去網上搜如果你安裝的是VS,那麼系統會給你配置好環境變數,你可以直接調用Visual
Stdio
命令行提示符輸入cl命令編譯
『貳』 命令行下編譯vs2010工程怎麼做
1.找到vs的cl.exe所在目錄,在vs2010為f:\visual
2010\vc\bin,可參考。
2.點擊「我的電腦」進行環境變數的配置,找到"path"變數加分號後加入剛才的路徑。
3.重新運行cmd開啟新的命令窗口,輸入cl檢查path設置是否生效。(只需配置一次即可,以後再次運行的時候不用再運行此命令)。
4.輸入vcvars32,這條命令是運行同路徑下的vcvars32.bat設置它的環境變數。
5.輸入cl
hello.cpp即可正常編譯。
編譯工程有兩個方法:
"c:\program
files\microsoft
visual
studio
10.0\common7\ide\devenv.exe"
/rebuild
"release|win32"
xxxxxxxxx.sln
專門的build工具:msbuild,通過開始菜單=>microsoft
visual
studio
2010=>visual
studio
tools=>visual
studio
command
prompt
(2010)
,啟動命令行環境,執行一下msbuild
『叄』 VC++命令行操作
cl.exe所在的文件夾裡面有一個批處理叫做
VSVAR32.BAT
首先運行它一次,你就可以用cl.exe來編譯你的代碼了。
CL.exe 是控制 Microsoft C 和 C++ 編譯器與鏈接器的 32 位工具。編譯器產生通用對象文件格式 (COFF) 對象 (.obj) 文件。鏈接器產生可執行文件 (.exe) 或動態鏈接庫文件 (DLL)。
注意,所有編譯器選項都區分大小寫。
若要編譯但不鏈接,請使用 /c。
使用 NMAKE 生成輸出文件。
使用 BSCMAKE 支持類瀏覽。
以下是一個完整的編譯器選項分類列表。
優化
選項 作用
/O1 創建小代碼
/O2 創建快速代碼
/Oa 假設沒有別名
/Ob 控制內聯展開
/Od 禁用優化
/Og 使用全局優化
/Oi 生成內部函數
/Op 改善浮點數一致性
/Os 代碼大小優先
/Ot 代碼速度優先
/Ow 假定在函數調用中使用別名
/Ox 使用最大優化 (/Ob1gity /Gs)
/Oy 省略框架指針
代碼生成
選項 作用
/clr 啟用 C++ 的託管擴展並產生在公共語言運行庫上運行的輸出文件
/EH 指定異常處理模型
/G3 優化代碼以優選 386 處理器。在 Visual C++ 5.0 中已經停用,編譯器將忽略此選項
/G4 優化代碼以優選 486 處理器。在 Visual C++ 5.0 中已經停用,編譯器將忽略此選項
/G5 優化代碼以優選 Pentium
/GB 與 /G6 等效;將 _M_IX86 的值設置為 600
/Gd 使用 __cdecl 調用約定
/Ge 激活堆棧探測
/GF
/GF 啟用字元串池
/GH 調用掛鉤函數 _penter
/GH 調用掛鉤函數 _pexit
/GL 啟用全程序優化
/Gm 啟用最小重新生成
/Gr 啟用運行時類型信息 (RTTI)
/Gr 使用 __fastcall 調用約定
/GS 控制堆棧探測
/GT 支持使用靜態線程本地存儲區分配的數據的纖程安全
/GX 啟用同步異常處理
/Gy 啟用函數級鏈接
/GZ 使用 __stdcall 調用約定
/MD 使用 MSVCRT.lib 創建多線程 DLL
/MDd 使用 MSVCRTD.lib 創建調試多線程 DLL
/ML 使用 LIBC.lib 創建單線程可執行文件
/MLd 使用 LIBCD.lib 創建調試單線程可執行文件
/MT 使用 LIBCMT.lib 創建多線程可執行文件
/MTd 使用 LIBCMTD.lib 創建調試多線程可執行文件
輸出文件
選項 作用
/FA
/FA 創建列表文件
設置列表文件名
/Fd 重命名程序資料庫文件
/Fe 重命名可執行文件
/Fm 創建映射文件
/Fo 創建對象文件
/Fp 指定預編譯頭文件名
/FR
/FR 生成瀏覽器文件
/Fx 將插入的代碼與源文件合並
調試
選項 作用
/GS 緩沖區安全檢查
/GZ 與 /RTC1 相同
/RTC 啟用運行時錯誤檢查
/Wp64 檢測 64 位可移植性問題
/Yd 將完整的調試信息放在所有對象文件中
/Yl 創建調試庫時插入 PCH 引用
/Z7 生成與 C 7.0 兼容的調試信息
/Zd 生成行號
/Zi 生成完整的調試信息
預處理器
選項 作用
/AI 指定在解析傳遞到#using 指令的文件引用時搜索的目錄
/c 在預處理期間保留注釋
/D 定義常數和宏
/E 將預處理器輸出復制到標准輸出
/EP 將預處理器輸出復制到標准輸出
/Fl 預處理指定的包含文件
/FU 強制使用文件名,就像它已被傳遞到#using 指令一樣
/I 在目錄中搜索包含文件
/P 將預處理器輸出寫入文件
/U 移除預定義宏
/U 移除所有的預定義宏
/X 忽略標准包含目錄
/ZI 將調試信息包含在與「編輯並繼續」兼容的程序資料庫中
語言
選項 作用
/noBool 取消 C++ bool、true 和 false 關鍵字
/vd 取消或啟用隱藏的 vtordisp 類成員
/vmb 對指向成員的指針使用最佳的基
/vmg 對指向成員的指針使用完全一般性
/vmm 聲明多重繼承
/vms 聲明單一繼承
/vmv 聲明虛擬繼承
/Za 禁用語言擴展
/Zc 在 /Ze 下指定標准行為
/Ze 啟用語言擴展
/Zg 生成函數原型
/Zl 從 .obj 文件中移除默認庫名
/Zp n 封裝結構成員
/Zs 只檢查語法
鏈接
選項 作用
/F 設置堆棧大小
/LD 創建動態鏈接庫
/LDd 創建調試動態鏈接庫
/link 將指定的選項傳遞給 LINK
/MD 使用 MSVCRT.lib 編譯以創建多線程 DLL
/MDd 使用 MSVCRTD.lib 編譯以創建調試多線程 DLL
/ML 使用 LIBC.lib 編譯以創建單線程可執行文件
/MLd 使用 LIBCD.lib 編譯以創建調試單線程可執行文件
/MT 使用 LIBCMT.lib 編譯以創建多線程可執行文件
/MTd 使用 LIBCMTD.lib 編譯以創建調試多線程可執行文件
預編譯頭
選項 作用
/Y- 忽略當前生成中的所有其他預編譯頭編譯器選項
/Yc 創建預編譯頭文件
/Yd 將完整的調試信息放在所有對象文件中
/Yu 在生成期間使用預編譯頭文件
/YX 自動處理預編譯頭
雜項
選項 作用
@ 指定響應文件
/? 列出編譯器選項
/c 編譯但不鏈接
/H 限制外部(公共)名稱的長度
/HELP 列出編譯器選項
/J 更改默認的 char 類型
/NOLOGO 取消顯示登錄版權標志
/QI0f 確保 Pentium 0F 指令沒有問題
/QIfdiv FDIV、FPREM、FPTAN 和 FPATAN 指令有缺陷的 Intel Pentium 微處理器的變通方法
QIfist 當需要從浮點類型轉換為整型時取消 Helper 函數 _ftol 的調用
/showIncludes 在編譯期間顯示所有包含文件的列表
/Tc
/Tc 指定 C 源文件
/Tp
/Tp 指定 C++ 源文件
/V 設置版本字元串
/w 設置警告等級
/w 禁用所有警告
/Wall 啟用所有警告,包括默認情況下禁用的警告
/WL 在從命令行編譯 C++ 源代碼時啟用錯誤信息和警告消息的單行診斷
/Zm 設置編譯器的內存分配限制
CL 命令行使用下列語法:
CL [option...] file... [option | file]... [lib...] [@command-file] [/link link-opt...]
下表說明CL 命令的輸入項意義
option 一個或多個 CL 選項。請注意,所有選項都應用於所有指定的源文件。選項是由一個正斜杠 (/) 或一個短劃線 (–) 指定的。如果某個選項帶有參數,則該選項的說明指定在選項和參數之間是否允許有空格。選項名(/HELP 選項除外)區分大小寫。有關更多信息,請參閱 CL 選項的順序。
file 一個或多個源文件、.obj 文件或庫的名稱。CL 編譯源文件並將 .obj 文件和庫的名稱傳遞給鏈接器。有關更多信息,請參閱 CL 文件名語法。
lib 一個或多個庫名。CL 將這些名稱傳遞給鏈接器。
command-file 包含多個選項和文件名的文件。有關更多信息,請參閱 CL 命令文件。
link-opt 一個或多個鏈接器選項。CL 將這些選項傳遞給鏈接器。
您可以指定任意數目的選項、文件名和庫名,條件是命令行上的字元數不超過 1024,該限制是操作系統指定的。
CL 命令文件請參見
設置編譯器選項 | 編譯器選項
命令文件是一個文本文件,它包含您另外在命令行上鍵入或使用 CL 環境變數指定的選項和文件名。CL 接受在 CL 環境變數中或命令行上用作參數的編譯器命令文件。與命令行或 CL 環境變數不同,命令文件允許使用多行選項和文件名。
命令文件中的選項和文件名將根據 CL 環境變數中或命令行上的命令文件名的位置被進行處理。但是,如果 /link 選項出現在命令文件中,則該行其餘部分的所有選項將被傳遞給鏈接器。命令文件的後面幾行中的選項和命令行上命令文件調用之後的選項仍被作為編譯器選項接受。
命令文件一定不能包含 CL 命令。每個選項必須在同一行上開始和結束;不能使用反斜杠 (\) 跨行組合一個選項。
命令文件用一個 @ 符後接一個文件名指定;該文件名可指定絕對路徑或相對路徑。
『肆』 如何用命令行 cmd 編譯運行c c 程序
Windows系統下編譯連接源代碼方法:
cl -GX test.c
-GX: 啟動同步異常處理
上面的命令會產生可執行程序:test.exe
在命令行中直接輸入:test.exe 就可運行該程序
Tips:
一、cmd中鍵入cl提示不認識cl命令,則由於無法找到cl.exe程序。解決方法如下:
添加系統變數(Path),這樣:我的電腦->屬性->高級->環境變數->系統變數,在path中添加
C:/Program Files/Microsoft Visual Studio 9.0/VC/bin;。
注意:
1、結尾最後用「;」隔開!
2、如果你的Microsoft Visual Studio 低於9.0版本或高於9.0版需要修改上面的路徑名稱。
二、cmd中鍵入cl執行編譯時會出現mspdb80.dll無法找到的情況,是因為VC/Bin/下沒有 「msobj80.dll,
mspdb80.dll,mspdbcore.dll,mspdbsrv.exe」這四個文件,解決的方法:
1>直接從Common7/IDE/下復制這四個文件到VC/Bin/下即可解決
2>添加系統變數(Path),這樣:我的電腦->屬性->高級->環境變數->系統變數,在path中添加 C:/Program Files/Microsoft Visual Studio 8/Common7/IDE;,注意結尾最後用「;」隔開!
這樣在用cl編譯就不會出現mspdb80.dll文件找不到的錯誤了。
『伍』 求教關於用 VS2010用命令行如何 編譯C++工程 (最好有詳細示例)
用法:
devenv
[解決方案文件
|
項目文件
|
任意文件.擴展名]
[開關]
devenv
的第一個參數通常是一個解決方案文件或項目文件。
如果您希望在編輯器中自動打開文件,
也可以使用任何其他文件作為第一個參數。當您輸入項目文件時,ide
會在項目文件的父目錄中查找與該項目文件具有相同
基名稱的
.sln
文件。如果不存在這樣的
.sln
文件,
ide
將查找引用該項目的單個
.sln
文件。如果不存在這樣的單個
.sln
文件,則
ide
將創建一個具有默認
.sln
文件名的未保存
的解決方案,其基名稱與項目文件的基名稱相同。
『陸』 如何在命令行下編譯VC程序
如何在命令行下編譯VC 程序 最近電腦裝的東西太多了,編譯一個程序都好半天,實在沒辦法,只能在命令行下了,這樣還能快一點。(應該對我機器來說快很多啊。O(∩_∩)o)閑言少敘。 第一步:設置環境變數。我的電腦,右擊,-> 屬性 ->高級 ->環境變數 ->新建 變數名:include 值: E:\Program Files\Microsoft Visual Studio\VC98\atl\include;E:\Program Files\Microsoft Visual Studio\VC98\mfc\include;E:\Program Files\Microsoft Visual Studio\VC98\include 變數名:lib 值: E:\Program Files\Microsoft Visual Studio\VC98\mfc\lib;E:\Program Files\Microsoft Visual Studio\VC98\lib 這個值是你自己的C++的安裝目錄。 在這里加入這兩個變數 當然,你也可以在系統變數中添加這兩個變數,這樣所有這台機器上的用戶都可以使用了。 都做完以後,這時就去命令行下試驗一下吧。 鍵入 cl /?會出現一大堆參數,具體含義大家自己摸索吧,我英語不好,這里就不誤導大家了。 一個實例,當然還是Hello World 了 打開記事本,敲入以下程序,重名為Hello.cpp #include int main() { cout << "HelloWorld!" << endl; return 0; } 進入命令行,找到該文件所在目錄,鍵入cl Hello.cpp ,然後鍵入Hello.exe 於是乎,熟悉的Hello World 出現了。 編譯多文件程序怎麼辦?其實加個通配符就歐了。如下: cl *.cpp 由於手頭沒有比較大規模的程序,就不跟大家演示了。 對了,還有關於link 選項,如果你編譯時,出現了在圖形界面的情況下能正常編譯連接,而命令行下出現一堆link 錯誤,那你就得用這個選項了 cl ?.cpp /link ?.lib,用到了哪個 lib 在這里加進去就OK 了。希望對機器不是特別快的同學有用。
『柒』 如何在Windows下用命令行編譯C/C++文件
在控制台編譯運行一個C程序,在windows上的c語言編譯器為cl.exe,在linux平台上的c語言編譯器是gcc。
在命令提示符中,執行cl
test.c(test.c是c語言源碼文件)。下圖是用cl編譯器編譯main.cxx的誰的,並且執行生成的程序main.exe。
『捌』 如何在windows的命令行環境下編譯C++程序
第一步:安裝編譯環境
下載並安裝Visual Studio,本人安裝的Visual Studio 2012
第二步:設置環境變數
1)右鍵「計算機(我的電腦)」,選擇「屬性->高級系統設置->環境變數」,找到「系統變數」中的「PATH"屬性,雙擊之
2)復制Visual Studio安裝目錄下的路徑「D:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin」到環境變數中(PATH中已經有其它變數,則粘貼到最後面,並且用英文「;」與前面的變數隔開)
第三步:修改命令行啟動參數
1)在「開始->運行」中輸入「cmd」,開始菜單中將列出"cmd.exe",右鍵它,然後「發送到->發送到桌面快捷方式」
2)右鍵步驟1)中創建的桌面快捷方式,選擇「屬性->快捷方式」,找到「目標(T)」欄,修改目標為「C:\Windows\System32\cmd.exe /k vcvars32.bat」,修改好後點確定
第四步:編寫test.cpp程序
1)在D盤新建一個文件夾,命名為testCode
2)打開testCode,在裡面新建一個文本文檔,命名為test.cpp(注意,如果你的系統設置中隱藏了已知文件類型的擴展名,必須顯示它,否則你創建的test.cpp的真實名字將是test.cpp.txt)
3)用記事本或EditPlus打開test.cpp,在其中寫入代碼,例如:
#include <iostream>
int main()
{
std::cout<<"Hello World!"<<std::endl;
while(1)
{
//ignore
}
}
第五步:編譯test.cpp
1)雙擊第三步中創建的cmd.exe的桌面快捷方式,打開命令行窗口
2)輸入:cd d: 回車
3)輸入:cd Ccodes 回車
4)輸入:cl -EHsc test.cpp 回車
編譯器開始編譯test.cpp。我們可以從命令行的輸出內容中看到編譯結果。如果程序沒有書寫錯誤,一定可以編譯出一個test.exe和一個test.obj。其中exe文件即是編譯後的可執行程序。obj文件是按塊編譯產生的中間文件。至此,整個命令行編譯流程結束。
『玖』 如何命令行編譯C#sln工程
一 使用devenv來build單個project
devenv是VisualStudio的可執行程序,一般安裝在「C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE」下。用來在命令行或GUI方式運行VisualStudio。其中devenv.com是命令行程序,devenv.exe是GUI的程序。默認地當你調用devenv的時候其實是啟動devenv.com,除非你顯示地調用devenv.exe才會啟動GUI的VisualStudio。
使用devenv來build一個.sln的實例:
devenv d:\Build\MyProject\Src\MyProject.sln /Build "Release|Win32"
使用devenv來build一個.sln中的某個的實例:
devenv.exe d:\Build\MyProject\Src\NyProject.sln /build "Release|Win32" /Project MyProject1
注意:通常地.sln中的多個Projects間有依賴關系,所以雖然你只是build一個.sln中的某個Project,但是還是需要指定Project所在.sln,然後通過/Project來指定Project的名字。
如果只是單個的Project,沒有引用其他的projects,這個時候可以不指定.sln,直接build Project,如下實例:
devenv d:\Build\MyProject\Src\MyProject.vcxproj /Build "Release|Win32"
注意此時實際上devenv做如下事:
此時devenv將在此project文件的父目錄中查找與Project相同名字的.sln;
如果沒有找到的話,然後查找其他的引用了此Project的.sln;
如果還是沒有找到的話會創建臨時的不保存的與Project同名的.sln。
二 devenv的更多幫助
可以使用devenv /?來查看詳細的幫助。
.sln或project的路徑有空格時,需要對路徑加"";
多個/開關間使用空格隔開;
devenv不支持通配符或正則表達式語法;
三 MSBuild
如果你的機器上沒有裝有VisualStudio,那麼可以使用MSBuild來build .sln或project。MSBuild可以通過安裝.NETFramework來安裝,一般的安裝路徑為C:\Windows\Microsoft.NET\Framework。其實devenv執行build時候,後台也是調用MSBuild來build的。
可以使用msbuild /?來查看詳細的幫助;
簡單實例如下:
MSBuild MyApp.sln /t:Rebuild /p:Configuration=Release
MSBuild MyApp.csproj /t:Clean
/p:Configuration=Debug;/p:Platform=x86;TargetFrameworkVersion=v3.5
同樣注意,如果project引用了其他的projects的時候,最好build整個.sln。
『拾』 如何用批處理實現vc2010工程的編譯請高手指點,謝謝
用nmake.exe
命令語法如下:
NMAKE [option...] [macros...] [targets...] [@commandfile...]
說明:其中,options是NMAKE的選項,macros是在命令行中的宏定義,targets是NMAKE的目標文件列表,commandfile是包含命令行輸入的文本文件(或響應文件)。
NMAKE 使用指定 /F 選項的Makefile(生成文件,通常名字是makefile);如果未指定 /F 選項,則使用當前目錄下的Makefile。如果未指定Makefile,則 NMAKE 使用推理規則生成命令行 targets。
關鍵是這個makefile文件的編寫。給你個例子 參考
BIN = cppunit
DEBUG = 1
# dynamic dll 1, static lib 2, exe 3
TARGET_TYPE = 1
# thread model, 0 single, 1 multiple static, 2 multiple dll
THREAD_MODEL = 2
CPU = x86
UNICODE = 0
CINCLUDE_PATH = /I. /I..\..\include
LLIBS =
DLLFLAGS =
CFLAGS = /W4 /Zc:forScope /Zc:wchar_t /EHsc
CFLAGS = $(CFLAGS) $(CINCLUDE_PATH)
!IF "$(UNICODE)" == "1"
CFLAGS = $(CFLAGS) /D"_UNICODE" /D"UNICODE"
!ENDIF
LDFLAGS = /NOLOGO /MACHINE:$(CPU)
LDFLAGS = $(LDFLAGS) $(LLIBS)
TARGET =
!IF "$(DEBUG)" == "1"
TARGET = $(BIN)d
CFLAGS = $(CFLAGS) /Od /Ob0 /ZI /D"_DEBUG"
LDFLAGS = $(LDFLAGS) /DEBUG
!ELSE
TARGET = $(BIN)
CFLAGS = $(CFLAGS) /O2 /Ob1 /Zi /D"NDEBUG"
LDFLAGS = $(LDFLAGS) /OPT:REF /OPT:ICF
!ENDIF
LINK_TOOL =
!IF "$(TARGET_TYPE)" == "1"
LINK_TOOL = LINK /DLL /MANIFEST:NO
TARGET = $(TARGET).dll
!ELSEIF "$(TARGET_TYPE)" == "2"
LINK_TOOL = LIB
TARGET = $(TARGET).lib
!ELSE
TARGET = $(TARGET).exe
LINK_TOOL = LINK /MANIFEST:NO
!ENDIF
!IF "$(THREAD_MODEL)" == "1"
!IF "$(DEBUG)" == "0"
DLLFLAGS = /MT
!ELSE
DLLFLAGS = /MTd
!ENDIF
!ENDIF
!IF "$(THREAD_MODEL)" == "2"
!IF "$(DEBUG)" == "0"
DLLFLAGS = /MD
!ELSE
DLLFLAGS = /MDd
!ENDIF
!ENDIF
CFLAGS = $(CFLAGS) $(DLLFLAGS)
SRC = \
AdditionalMessage.cpp \
Asserter.cpp \
BeOsDynamicLibraryManager.cpp \
BriefTestProgressListener.cpp \
CompilerOutputter.cpp \
DefaultProtector.cpp \
DllMain.cpp \
DynamicLibraryManager.cpp \
.cpp \
Exception.cpp \
Message.cpp \
PlugInManager.cpp \
PlugInParameters.cpp \
Protector.cpp \
ProtectorChain.cpp \
RepeatedTest.cpp \
ShlDynamicLibraryManager.cpp \
SourceLine.cpp \
StringTools.cpp \
SynchronizedObject.cpp \
Test.cpp \
TestAssert.cpp \
TestCase.cpp \
TestCaseDecorator.cpp \
TestComposite.cpp \
TestDecorator.cpp \
TestFactoryRegistry.cpp \
TestFailure.cpp \
TestLeaf.cpp \
TestNamer.cpp \
TestPath.cpp \
TestPlugInDefaultImpl.cpp \
TestResult.cpp \
TestResultCollector.cpp \
TestRunner.cpp \
TestSetUp.cpp \
TestSuccessListener.cpp \
TestSuite.cpp \
TestSuiteBuilderContext.cpp \
TextOutputter.cpp \
TextTestProgressListener.cpp \
TextTestResult.cpp \
TextTestRunner.cpp \
TypeInfoHelper.cpp \
UnixDynamicLibraryManager.cpp \
Win32DynamicLibraryManager.cpp \
XmlDocument.cpp \
XmlElement.cpp \
XmlOutputter.cpp \
XmlOutputterHook.cpp
OBJECTS = $(SRC:.cpp=.obj)
all : $(TARGET)
$(TARGET) : $(OBJECTS)
$(LINK_TOOL) $(LDFLAGS) $(OBJECTS) /OUT:$(TARGET)
.c.obj::
$(CC) /c $(CFLAGS) $<
#
.cpp.obj::
$(CC) /c $(CFLAGS) $<
#
clean :
del /q $(TARGET)
del /q $(OBJECTS)
del /q *.pdb
del /q *.idb
能用ide還是盡量用ide吧,多方便。