Trang 3 trên tổng số 3 Đầu tiênĐầu tiên 123
Từ 21 tới 24 trên tổng số 24 kết quả

Đề tài: Biên dịch source code c/c++ bằng Command Line

  1. #21
    Ngày gia nhập
    12 2015
    Nơi ở
    Đà Nẵng
    Bài viết
    537

    Mặc định Biên dịch source code c/c++ bằng Command Line

    Trích dẫn Nguyên bản được gửi bởi Monre Xem bài viết
    Mfc có chút đặc biệt, nó không có điểm nhập (entry point: main/winmain)

    C++ Code:
    1. #include <afxwin.h>
    2.  
    3. #define ID_COMMAND_DRAWPIXEL      1001
    4. #define ID_COMMAND_DRAWLINE       1002
    5. #define ID_COMMAND_DRAWTRIANGLE   1003
    6. #define ID_COMMAND_DRAWRECTANGLE  1004
    7. #define ID_COMMAND_DRAWPOLY       1005
    8.  
    9. char * szMenuID[] = {
    10.     "ID_COMMAND_DRAWPIXEL",
    11.     "ID_COMMAND_DRAWLINE",
    12.     "ID_COMMAND_DRAWTRIANGLE",
    13.     "ID_COMMAND_DRAWRECTANGLE",
    14.     "ID_COMMAND_DRAWPOLY"
    15. };
    16.  
    17. class CMyWnd : public CFrameWnd{
    18.   private:
    19.   CMenu mnuMain;
    20.   CMenu mnuDraw;
    21.   public:
    22.     CMyWnd();
    23.     afx_msg void OnRangeCmds(UINT id);
    24.     afx_msg void OnDestroy();
    25.     DECLARE_MESSAGE_MAP()
    26. };
    27.  
    28. BEGIN_MESSAGE_MAP(CMyWnd, CFrameWnd)
    29. ON_COMMAND_RANGE(ID_COMMAND_DRAWPIXEL, ID_COMMAND_DRAWPOLY, CMyWnd::OnRangeCmds)
    30. ON_WM_DESTROY()
    31. END_MESSAGE_MAP()
    32.  
    33. CMyWnd::CMyWnd(){
    34.   Create(NULL, "Menu ID Range Demo", WS_OVERLAPPEDWINDOW, CRect(200, 120, 640, 400), NULL);
    35.   mnuMain.CreateMenu();
    36.   mnuDraw.CreateMenu();
    37.   mnuMain.AppendMenu(MF_POPUP | MF_STRING, (UINT)mnuDraw.m_hMenu ,        "Draw");
    38.   mnuDraw.AppendMenu(MF_BYPOSITION | MF_STRING, ID_COMMAND_DRAWPIXEL,     "Pixel");
    39.   mnuDraw.AppendMenu(MF_BYPOSITION | MF_STRING, ID_COMMAND_DRAWLINE,      "Line");
    40.   mnuDraw.AppendMenu(MF_BYPOSITION | MF_STRING, ID_COMMAND_DRAWTRIANGLE,  "Triangle");
    41.   mnuDraw.AppendMenu(MF_BYPOSITION | MF_STRING, ID_COMMAND_DRAWRECTANGLE, "Rectangle");
    42.   mnuDraw.AppendMenu(MF_BYPOSITION | MF_STRING, ID_COMMAND_DRAWPOLY,      "Poly");
    43.   SetMenu(&mnuMain);
    44. }
    45. afx_msg void CMyWnd::OnDestroy(){
    46.    mnuMain.DestroyMenu();
    47.    mnuDraw.DestroyMenu();
    48. }
    49. afx_msg void CMyWnd::OnRangeCmds(UINT id){
    50.   CString msg;
    51.   msg.Format("Menu id %d %s",id, szMenuID[id-ID_COMMAND_DRAWPIXEL]);
    52.   AfxMessageBox(msg, IDOK);
    53. }
    54.  
    55. class CMyApp : public  CWinApp {
    56.   public:
    57.     virtual BOOL InitInstance(){
    58.       m_pMainWnd = new CMyWnd();
    59.       m_pMainWnd->ShowWindow(SW_SHOW);
    60.       m_pMainWnd->UpdateWindow();
    61.       return TRUE;
    62.     }
    63. };
    64.  
    65. CMyApp app;

    code demo trên, một hàm - event có thể dùng chung cho nhiều item khác nhau

    Cmd Code:
    1. cl.exe /nologo /D _AFXDLL /EHsc MfcA.cpp /link /ENTRY:"WinMainCRTStartup"
    ...
    ..
    .
    MFC có winmain chứ. Chẳng qua là nó được tạo bởi MFC framework. Ta có thể viết mã cho CWinApp::InitInstance, ... thay vì winmain(trong implement của winmain nó có gọi InitInstance, DestroyInstance, Run... của CWinApp)
    Soi trong mã nguồn của thư viện MFC chắc sẽ tìm thấy winmain nó được viết như thế nào.

  2. #22
    Ngày gia nhập
    08 2017
    Bài viết
    3,905

    + Trên, biên dịch sẽ báo lỗi:
    ..\VC\ATLMFC\INCLUDE\afxver_.h(81) : fatal error C1189: #error : Please use the /MD switch for _AFXDLL builds

    Thêm /MD nó có cảnh báo (không còn lỗi): _WIN32_WINNT not defined. Defaulting to _WIN32_WINNT_MAXVER (see WinSDKVer.h)
    Code:
    cl /nologo /MD /D _AFXDLL /EHsc MfcA.cpp /link /ENTRY:"WinMainCRTStartup"
    + Có thể phối hợp biên dịch: cl.exe /c và liên kết link.exe ... trên cmd. (lúc khác sẽ bàn tới)

    + Mfc có điểm vào (WinMain) đúng là chuyện lạ. Thử viết code gọi nó (main/WinMain) thử xem nó hoạt động không thì biết!
    ...
    ..
    .

  3. #23
    Ngày gia nhập
    12 2015
    Nơi ở
    Đà Nẵng
    Bài viết
    537

    Trích dẫn Nguyên bản được gửi bởi Monre Xem bài viết
    + Trên, biên dịch sẽ báo lỗi:
    ..\VC\ATLMFC\INCLUDE\afxver_.h(81) : fatal error C1189: #error : Please use the /MD switch for _AFXDLL builds

    Thêm /MD nó có cảnh báo (không còn lỗi): _WIN32_WINNT not defined. Defaulting to _WIN32_WINNT_MAXVER (see WinSDKVer.h)
    Code:
    cl /nologo /MD /D _AFXDLL /EHsc MfcA.cpp /link /ENTRY:"WinMainCRTStartup"
    + Có thể phối hợp biên dịch: cl.exe /c và liên kết link.exe ... trên cmd. (lúc khác sẽ bàn tới)

    + Mfc có điểm vào (WinMain) đúng là chuyện lạ. Thử viết code gọi nó (main/WinMain) thử xem nó hoạt động không thì biết!
    ...
    ..
    .
    MFC đúng là có WinMain , nhưng nói WinMain là điểm nhập thì mình không rõ đúng hay sai nữa. Mong các cao nhân chỉ giáo
    https://www.codeproject.com/Questions/58411/who-calls-WinMain-in-vc
    Đã được chỉnh sửa lần cuối bởi khoaph : 11-03-2021 lúc 07:47 AM.

  4. #24
    Ngày gia nhập
    08 2017
    Bài viết
    3,905

    Biên dịch 2 pha bằng MsC 2010:
    Batch Code:
    1. ::
    2. CL.exe /c /nologo /W3 /WX- /O2 /Oi /Oy- /GL /D UNICODE /D _AFXDLL /Gm- /EHsc /MD /GS /Gy /Fo"Binn\\" /Gd /TP MfcA.cpp
    3.  
    4. ::
    5. link.exe /nologo /OUT:Binn\MfcA.exe /SUBSYSTEM:WINDOWS /ENTRY:"WinMainCRTStartup" /MACHINE:X86 Binn\MfcA.obj

    ...
    ..
    .

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn