精华内容
下载资源
问答
  • VC6命令行编译配置

    千次阅读 2013-08-30 10:11:12
    对于大多数在windows上写windows C/C++应用程序的人可能用的都是微软提供的VC++6.0或Visual Studio集成开发环境,但是对想为了更好地理解程序编译链接过程和习惯如linux般在命令行下工作的人来说,我们也可以配置...

    对于大多数在windows上写windows C/C++应用程序的人可能用的都是微软提供的VC++6.0或Visual Studio集成开发环境,但是对想为了更好地理解程序编译链接过程和习惯如linux般在命令行下工作的人来说,我们也可以配置使用命令行编译程序。

    事实上,基本的程序编译链接工具为一个编译器和链接器——编译器负责把C/C++代码编译成目标二进制代码(对微软编译器一般生成.obj文件),链接器负责把目标二进制代码和各种C/C++提供的标准库(如C语言标准库的C runtime:libc.lib)链接起来,再加上特定的启动代码就生成了一个标准的windows exe或dll程序。而微软VC++6.0或Visual Studio集成开发环境所做的工作就是在这个编译器和链接器上构建一个用于编辑代码的IDE、编译链接参数配置和调试输出的GUI界面、便于项目集成管理的工作空间(VC6,对应为.dsw文件和.dsp文件)或解决方案(Visual Studio,对应文件为.sln文件)。

    那么下面我们具体看一下微软C/C++的编译器和链接器,微软采用cl.exe和link.exe来编译和链接程序,cl.exe又可兼做编译器(compile)和链接器(link)的作用。同带GUI界面的集成开发环境一样,在命令行下需要一个管理多个文件编译的工具,微软用的是nmake.exe。笔者自己的电脑XP上VC6安装在D盘,找到安装位置打开如下


    打开Common下MSDev98文件夹如下


    打开VC98文件夹如下


    进入个文件各个文件夹查看,可知微软提供的cl.exe,link.exe,nmake.exe程序都存在VC98的Bin文件下

    若此时切换到命令行(在附件中打开或Win+R运行cmd),敲入cl提示是找不到程序的,此时要做的是把VC98的Bin目录加到系统目录中,再敲入cl可能会出现提示找不到MSPDB60.DLL的错误,这是因为该cl.exe的支持工具找不到,看到前面有Common下MSDev98,自然想到支持文件在其下Bin文件夹中,果然在其中找到MSPDB60.DLL。因此我们还要做的就是把MSDev98的Bin目录加到系统目录下

    找到系统环境变量编辑处添加系统目录,如下(我的电脑->查看系统信息->系统属性->高级->环境变量)


    可以在系统变量或用户变量中添加,笔者习惯在用户变量中添加系统目录,在用户变量中找到PATH变量(若没有则新建),在原有变量中加上D:\XP\Microsoft Visual Studio\Common\MSDev98\Bin和D:\XP\Microsoft Visual Studio\VC98\Bin目录。此时调入新的命令行窗口读入新的环境变量,注意若以前此时直接在以前打开的命令行窗口敲入cl还是不行,必须重新开cmd或新建cmd窗口读入新的环境变量才能运行。

    下面新建一个新的a.c程序如下

    #include<stdio.h>
    int main(int argc, char *argv[])
    {
        printf("cl, link and nmake test");
        return 0;
    }

    编译:cl /Gx a.c 

    此时提示无法找到或链接stdio.h,这是因为编译器找不到要包含的头文件或链接的库文件,此时只需要按照之前的步骤在用户变量中添加include位置和lib位置

    INCLUDE=D:\XP\Microsoft Visual Studio\VC98\MFC\Include;D:\XP\Microsoft Visual Studio\VC98\Include和

    LIB=D:\XP\Microsoft Visual Studio\VC98\Lib;D:\XP\Microsoft Visual Studio\VC98\MFC\Lib

    此时编译程序:cl /Gx a.c,可以看到生成了a.obj和a.exe,运行生成的a.exe,成功!

    至此,命令行配置完成


    注:

    命令行编译的使用,请参考相关命令说明

    1、在cmd敲入 cl -help 和link  -help及nmake -help查看相关参数和用法

    2、有些电脑装的盗版VC6会缺少MSPDB60.DLL,在此下载放入*\Microsoft Visual Studio\Common\MSDev98\Bin目录即可

    3、对于Visual Studio的配置和VC6配置相似,在此恕不赘述!


    原创,转载请注明来自http://blog.csdn.net/wenzhou1219

    展开全文
  • 最近写了一个应用程序,需要同时支持命令行模式和GUI模式。网上查了一下资料,这里把相关关键的点记录一下,便于以后使用,也希望能够帮助一些人。 关键点 设置项目为console 模式 如果项目默认不是命令行模式,...

    C#应用程序同时支持GUI模式和命令行模式

    前言
    最近写了一个应用程序,需要同时支持命令行模式和GUI模式。网上查了一下资料,这里把相关关键的点记录一下,便于以后使用,也希望能够帮助一些人。

    关键点

    1. 设置项目为console 模式
      如果项目默认不是命令行模式,可以通过项目属性来修改。
      在这里插入图片描述
    2. 声明Windows API
            private static extern IntPtr _GetConsoleWindow();
            [DllImport("kernel32.dll")]
            private static extern bool AttachConsole(int dwProcessId);
            private const int ATTACH_PARENT_PROCESS = -1;
    
            [DllImport("kernel32.dll")]
            public static extern Boolean FreeConsole();csharp
    
    1. 在Main 函数添加Code
    		static void Main(string[] args)
            {
                AttachConsole(ATTACH_PARENT_PROCESS);
    
                // if we have paramenters, then, it's console mode
                if (args.Length > 0)
                {
                    Console.WriteLine("Here we are in console mode");
                } else {
                    var consoleHandle = _GetConsoleWindow();
                    // run GUI and start forms
                    if (consoleHandle == IntPtr.Zero || AppDomain.CurrentDomain.FriendlyName.Contains(".vshost"))
                    {
                        FreeConsole();
                        Application.EnableVisualStyles();
                        Application.SetCompatibleTextRenderingDefault(false);
                        Application.Run(new Form1());
                    }
                    else
                    {
                        System.Console.WriteLine("console mode, but no parameters.");
                    }
                }
                
            }
    

    参考
    [1]. https://stackoverflow.com/questions/493536/can-one-executable-be-both-a-console-and-gui-application
    [2]. https://stackoverflow.com/questions/9618804/how-to-close-open-console-within-c-sharp-using-win32-calls

    展开全文
  • VC6命令行精简编译器

    2011-04-24 09:47:30
    VC6精简编译器 ·支持C++和Win32API开发 ·通过命令行编译程序
  • 让MFC支持命令行参数

    千次阅读 2011-10-31 14:27:08
    //注意:在BOOL CXXXApp::InitInstance()里面 //如果在CXXXDlg dlg; 之前加入,这个过程就是程序...//没有参数,返回值是一个LPTSTR类型的字符串指针,即命令行参数的字符串。 // LPWSTR *CommandLineToArgvW( //
    //注意:在BOOL CXXXApp::InitInstance()里面
    

    //如果在CXXXDlg dlg; 之前加入,这个过程就是程序框架出来之前。

    //简介 LPTSTR WINAPI GetCommandLine(void);

    //没有参数,返回值是一个LPTSTR类型的字符串指针,即命令行参数的字符串。

    // LPWSTR *CommandLineToArgvW(

    // LPCWSTR lpCmdLine,

    // int *pNumArgs);


    //定义int接收参数个数

    int nArgs = 0;

    //此项单独用来读取参数个数,用于一些需要先判断个数的程序

    CommandLineToArgvW(GetCommandLineW(), &nArgs);

    if (nArgs>=2)

    {

    //处理过程

    }


    //定义接受参数数据结构

    LPWSTR *szArglist = NULL;

     //获取参数 以及参数个数。

    szArglist = CommandLineToArgvW(GetCommandLineW(), &nArgs);  

    if( NULL != szArglist)

     {

    //szArglist就是保存参数的数组

      //nArgs是数组中参数的个数

    //数组的第一个元素表示程序本身,也就是szArglist[0],

      //其他的元素依次是输入参数

    }  

     //取得参数后,释放CommandLineToArgvW申请的空间

    CString str; 

     for (int i=1;i<nArgs;++i)

    {

    //处理szArglist[i]过程

    }

    //释放szArglist

    LocalFree(szArglist); 

    //如需要直接退出

    //exit(0);


    以下为参考资料
    让MFC程序支持命令行参数

    一般情况下,如果我们的VC工程是Console控制台类型或者是Win32类型的情况下,这两类的工程类型比较容易获得命令行参数,
    即,通过其入口点函数

    int main(int argc, char *argv[])
    int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)

    但是,如果我们的工程类型是MFC对话框或单文档类型的话,如何让我们的程序支持命令行参数呢?
    系统没有为我们提供好,那我们只有自己获取了……

    一般情况下,需要在MFC程序的主线程初始化函数中进行处理,主线程的初始化函数即:
    BOOL CProjCleanerApp::InitInstance(),这里面我们假设工程的名字是ProjCleaner,CProjCleanerApp 即主线程类。
    在 BOOL CProjCleanerApp::InitInstance() 函数中进行程序的初始化以及对话框界面的显示工作,其大致代码如下:

    BOOL CProjCleanerApp::InitInstance()
    {
    //省略的其他代码……;
    CWinApp::InitInstance();
    //省略的其他代码……;

    CProjCleanerDlg dlg; //新建主对话框类型对象;
    m_pMainWnd = &dlg;
    INT_PTR nResponse = dlg.DoModal(); //进行模态对话框的显示;
    if (nResponse == IDOK)
    {
    // TODO: Place code here to handle when the dialog is
    // dismissed with OK
    }
    else if (nResponse == IDCANCEL)
    {
    // TODO: Place code here to handle when the dialog is
    // dismissed with Cancel
    }
    return FALSE;
    }
    我们要获取程序的命令行参数,一般是在主对话框界面显示之前,即 CProjCleanerDlg dlg; 之前获取。
    获取的方法主要是调用 GetCommandLine 和 CommandLineToArgvW 函数。

    GetCommandLine 函数的原型定义如下:

    LPTSTR WINAPI GetCommandLine(void);
    没有参数,返回值是一个LPTSTR类型的字符串指针,即命令行参数的字符串。

    默认情况下,每个程序都会有一个命令行参数,即可执行程序本身的路径,第二个参数才是真正的附加命令行参数。
    举个例子,调用GetCommandLine函数获取到的命令行参数的字符串大致如下:

    "E:\SoftWare\ProjCleaner.exe" "-help"
    其中,"E:\SoftWare\ProjCleaner.exe" 为可执行文件的路径,"-help" 为附加的参数。

    调用完 GetCommandLine 函数获取到了命令行参数之后,
    我们就要调用 CommandLineToArgvW 函数去分解得到的命令行参数字符串,

    CommandLineToArgvW 函数的原型定义如下:

    LPWSTR *CommandLineToArgvW(
    LPCWSTR lpCmdLine,
    int *pNumArgs
    );

    他有两个参数,第一个参数 lpCmdLine 即通过 GetCommandLine 函数获取到的命令行参数字符串指针,
    第二个参数是一个 int 类型的指针,用这个参数返回命令行参数中的参数个数,
    默认情况下,pNumArgs 会返回1,如果有附加的命令行参数,该值会大于1,比如:
    "E:\SoftWare\ProjCleaner.exe" "-help"
    则,pNumArgs 会返回2。

    CommandLineToArgvW 函数的返回值是一个宽字节LPWSTR类型的字符串指针数组,
    数组中的每一个字符串指针代表着一个命令行参数,根据上面的示例,
    设返回值为:
    LPWSTR *lpszArgv,则 lpszArgv[0] 就是 "E:\SoftWare\ProjCleaner.exe",lpszArgv[1] 就是 "-help",这样大家明白了吧?

    通过 GetCommandLine、CommandLineToArgvW 两个函数就可以成功的获取并拆分命令行参数了。




    MFC也可以像控制台那样获取命令行参数:
    利用GetCommandLineW()函数获得命令行参数,
    利用CommandLineToArgvW()函数解析命令行参数。

    LPWSTR *szArglist = NULL;
    int nArgs = 0;
    szArglist = CommandLineToArgvW(GetCommandLineW(), &nArgs);
    if( NULL != szArglist)
    {
    //szArglist就是保存参数的数组
    //nArgs是数组中参数的个数
    //数组的第一个元素表示进程的path,也就是szArglist[0],其他的元素依次是输入参数。
    }
    //取得参数后,释放CommandLineToArgvW申请的空间
    LocalFree(szArglist);




    在MFC程序中,可以用以下几种方法来获取命令行参数。
    为方便说明,我们假设执行了命令:C:\test\app.exe -1 -2

    方法一
    ::GetCommandLine();
    将获取到 "C:\test\app.exe" -1 -2

    方法二
    for (int i=0;i<__argc;i++)
    {
    argv[i];
    将依次得到C:\test\app.exe -1 -2
    }

    方法三
    AfxGetApp()->m_lpCmdLine;
    将获取到 -1 -2



    获取命令行的方法:

    1、GetCommandLine() 获取输入的所有信息,包括程序所在路径及参数

    2、AfxGetApp()->m_lpCmdLine 只包含参数

    一般情况下,获取到命令行后就可以针对命令行中的内容进行相应的处理了



    CObject
    └CCommandLineInfo
    类CCommandLineInfo用于分析启动应用时的命令行参数。
    MFC应用一般都会在它的应用对象中使用函数InitInstance创建这个类的一个本地实例。
    然后把该对象传给CWinApp::ParseCommandLine,ParseCommandLine又重复调用ParseParam填充CCommandLineInfo对象。
    最后,CCommandLineInfo对象被传给CWinApp::ProcessShellCommand来处理命令行参数和选项。

    BOOL CExampleApp::InitInstance()
    {
    ...
    // 分析标准外壳命令、DDE、打开文件操作的命令行
    CCommandLineInfo cmdInfo;
    ParseCommandLine(cmdInfo);


    // 调度在命令行中指定的命令。如果
    // 用 /RegServer、/Register、/Unregserver 或 /Unregister 启动应用程序,则返回 FALSE。
    if (!ProcessShellCommand(cmdInfo))
    return FALSE;
    ...
    }


    void CWinApp::ParseCommandLine(CCommandLineInfo& rCmdInfo)
    {
    for (int i = 1; i < __argc; i++)
    {
    LPCTSTR pszParam = __targv[i];
    BOOL bFlag = FALSE;
    BOOL bLast = ((i + 1) == __argc);
    if (pszParam[0] == '-' || pszParam[0] == '/')
    {
    // remove flag specifier
    bFlag = TRUE;
    ++pszParam;
    }
    rCmdInfo.ParseParam(pszParam, bFlag, bLast);
    }
    }




    目标
    让应用程序处理这里所见的命令行标志。
    >XXX.exe /c /d
    策略
    一个MFC应用程序可以用CCommandLineInfo类的成员函数ParseParam()处理一些标准标
    志。要添加我们自己的标志,而仍然能够支持另外一些标志,我们将从CCommandLineInfo派
    生类,然后重载ParseParam()。
    步骤
    1.创建一个新的CCommandLineInfo类
    1)用ClassWizard创建一个派生于CCommandLineInfo的新类。在新类中,为应用程序要
    处理的每个新的标志添加一个Boolean或String成员变量。
    classCWzdCommandLineInfo:publicCCommandLineInfo
    {
    public:
    BOOLm_bAFlag;
    BOOLm_bCFlag;
    BOOLm_bDAFlag;
    CStringm_sArg;
    2)添加一个ParseParam()函数,以重载基类的ParseParam()函数。
    //Operations
    public:
    voidParseParam(constTCHAR*pszParam,BOOLbFlag,BOOLbLast);
    };
    3)如下实现ParseParam():
    voidCWzdCommandLineInfo::ParseParam(constTCHAR*pszParam,
    BOOLbFlag,BOOLbLast)
    {
    CStringsArg(pszParam);
    if(bFlag)
    {
    m_bAFlag=!sArg.CompareNoCase("a");
    m_bCFlag=!sArg.CompareNoCase("c");
    m_bDAFlag=!sArg.CompareNoCase("da");
    }
    //m_strFileNamegetsthefirstnonflagname
    elseif(m_strFileName.IsEmpty())
    {
    m_sArg=sArg;
    }


    第二部分用户界面实例

    CCommandLineInfo::ParseParam(pszParam,bFlag,bLast);
    }
    注意到变量pszParam包括命令行中的下一项。如果pszParam的后面是一个—(连字符)或
    /(正斜杠)字符,则bFlag变量为TRUE,这些字符将被删除;如果pszParam是一行中最后一个
    变量,则bLast为TRUE。确信最后调用基类的ParseParam(),否则标准标志不被处理。
    4)有关命令行消息类的详细清单,参见本节的“清单—命令行消息类”。
    2.把新的命令行消息类插到应用程序类中
    1)在应用程序类中找到ParseCommandLine(),并用该新类替换CCommandLineInfo类。
    //Parsecommandlineforstandardshellcommands,DDE,fileopen
    CWzdCommandLineInfocmdInfo;
    ParseCommandLine(cmdInfo);
    2)现在,命令行选项不能作为cmdInfo变量的成员变量。
    if(cmdInfo.m_bAFlag)
    {
    :::
    }
    3)要使这些选项在整个应用程序中可得,则把cmdInfo嵌入应用程序中,并访问它的成员
    变量。
    (CXXXApp*)AfxGetApp()->m_cmdInfo.m_bAFlag;
    注意:CXXXApp类是你自己创建的应用程序类
    说明
    ■标准MFC标志如下,真正处理这些标准命令行发生在ProcessShellCommand(cmdInfo)
    中,它正好在应用程序类中ParseCommandLine()之后。
    nothing使应用程序试图打开一个新文档
    filename使应用程序试图以文档方式打开文件名
    /pfilename使应用程序打开并打印给定的文件名到默认的打印机
    /ptfilename与上面相同,但输入到指定的打印机
    printerdriverport
    /dde使应用程序开始运行,并等待DDE命令
    /AutomationCOM标志
    /Embedding
    /Unregister
    /Unregserver
    ■处理非标准标志(如名字)会有点复杂,我们认为出现的第一个非标准标志是文档文件名。
    然而,一旦一个文件名被发现,可以根据目的攫取任何非标准标志,这就是说,除非
    遇到/pt标志,在这种情况下,下面三个非标准标志变量用来初始化打印。为了简化起
    见,也可通过不把/pt标志传递给基类中的ParseParam()来禁用/pt标志。
    ■当然,如果不需继续支持前面所示的标准MFC标志,则可以更加自由地行动。只要不
    用调用基类的ParseParam(),可以使用任何标志或非标准标志选项。但是,不要因为能
    用非标准标志,而轻易放弃这些标准标志提供的功能。

    展开全文
  • http://www.cctry.com/thread-4026-1-1.html
    http://www.cctry.com/thread-4026-1-1.html
    展开全文
  • VC++ MFC 支持 命令行参数 command line good
  • 命令行模式的 VC6编译器,解压到C盘根目录,设置环境变量。支持windows sdk 编程模式。
  • VC编译器命令行详解

    千次阅读 2010-06-04 16:54:00
    CL 命令行使用下列语法: CL [option...] file... [option | file]... [lib...] [@command-file] [/link link-opt...] 下表说明CL 命令的输入项意义 option 一个或多个 CL 选项。请注意,所有选项都...
  • VC命令行编译开源代码的常用做法

    千次阅读 2012-09-18 19:27:25
    因此要使用VC编译器编译开源代码,需要了解VC命令行的常用用法以及开源代码编译方面的知识。 开源代码一般采用两种做法来支持VC编译器,一是用CMake导出VC++项目文件,如OpenCV和OSG这类库是采用这
  • VC 命令行 CL

    千次阅读 2013-03-06 08:09:37
    如果你的 VC 6.0 是按默认安装在 C 盘的话,打开“Microsoft Visual Studio\VC98\Bin”里面有一个“VSVARS32.BAT” 的文件,打开它,运行一次,cl.exe 就可以使用了 如果你的 VC 6.0 是安装在其他盘(比如我的 VC ...
  • 如何用在命令行下使用VC编译器

    千次阅读 2011-09-16 14:46:53
    首先声明:高手请路过即可,谢谢支持!  现在恐怕很多人已经没有试过在命令行下使用微软的编译器cl来编译和运行程序了,VS提供的IDE环境能够很方便的组织程序。但是个人觉得明白编译链接的来龙去脉对于理解程序和...
  • VC命令行编译参数介绍

    千次阅读 2012-02-17 17:27:48
    您可以指定任意数目的选项、文件名和库名,条件是命令行上的字符数不超过1024,该限制是操作系统指定的。    command-file 包含多个选项和文件名的文件。有关更多信息,请参阅CL命令文件。    link-opt...
  • vc命令行调试和编译

    千次阅读 2010-02-03 15:07:00
    vc命令行调试和编译 收藏 CL.exe 是控制 Microsoft C 和 C++ 编译器与链接器的 32 位工具。编译器产生通用对象文件格式 (COFF) 对象 (.obj) 文件。链接器产生可执行文件 (.exe) 或动态链接库文件 (DLL)。注意,...
  • VC命令行编译参数简介

    千次阅读 2012-08-16 22:09:16
    支持使用静态线程本地存储区分配的数据的纤程安全    /GX  启用同步异常处理    /Gy  启用函数级链接    /GZ  使用  __stdcall  调用约定    /MD  使用  MSVCRT.lib  创建多线程   ...
  • 使用命令行编译vs2010的工程

    千次阅读 2015-08-13 09:19:08
    在Linux下面开发做久了,习惯了用命令行的终端编辑、编译,一个终端就可以全部搞定,用起来感觉蛮爽的。 这几天闲来无事,就搞了一个vs2010,学着用C#写小工具。 小工具写好了以后,也没什么卵事可做,就在vs的安装...
  • ImageMagick是一个免费的创建、编辑、...ImageMagick是免费软件:全部源码开放,可以自由使用,复制,修改,发布,它遵守GPL许可协议,可以运行于大多数的操作系统,ImageMagick的大多数功能的使用都来源于命令行工具。
  • 本人在开发某系统过程中需要将...程序虽小,但支持命令行参数方式调用。 调用格式为: bmp2jpg.exe 源BMP文件名 目标jpg文件名 [转换质量] 不带参数运行会自动弹出对话框提示参数信息。 转换质量默认为100%,%可省略。
  • vc是受启发的的命令行界面。 使来自generic后端的秘密易于访问 支持通过#行前缀的注释 具有bash和zsh自动完成功能 演示版 安装 下载。 解压缩并将vc移到所选目录中。 制作说明 要构建Vault-Client,您需要Go...
  • 命令行下编译VC2008工程

    千次阅读 2011-11-20 20:14:49
    CALL "C:/Program Files/Microsoft Visual Studio 9.0/VC/vcvarsall.bat" VCbuild "/xxx.vcproj" "Debug|Win32" VCBUILD 具有下列选项:可以使用help命令直接查看。 选项 说明 /clean...
  • vscode中使用git命令行

    千次阅读 2019-09-12 11:03:22
    vscode中使用git命令行 打开vscode中的设置 选择在settings.json中编辑,配置git的bash.exe的路径 完成
  • 作者:朱金灿 ... 经研究,windows的批处理命令对/支持不好,将if exist ./gdal19_i_D.lib del./gdal_i_D.lib改为if exist .\gdal19_i_D.lib del .\gdal_i_D.lib就好了。我的编译环境是win xp英文版+sp3。  
  • ImageMagick是一个免费的创建、编辑、...ImageMagick是免费软件:全部源码开放,可以自由使用,复制,修改,发布,它遵守GPL许可协议,可以运行于大多数的操作系统,ImageMagick的大多数功能的使用都来源于命令行工具。
  • VC6.0自带小工具

    千次阅读 2015-04-26 13:12:17
    VC6.0附带工具软件: (1)ActiveX Control Test Container称为“ActiveX 控件测试容器”,顾名思义,此工具的主要功能就是测试ActiveX 控件,可以通过改变ActiveX 控件的属性观察控件的变化,也可以通过调用...
  • FFMPEG 命令行参数详解

    千次阅读 2020-02-13 09:58:41
    -vc channel 设置视频捕获通道 DV1394专用 -tvstd standard 设置电视标准 NTSC PAL(SECAM) -dv1394 设置DV1394捕获 -av device 设置音频设备 比如/dev/dsp 2.6、高级选项 -map file:stream 设置输入流映射 -...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 25,934
精华内容 10,373
关键字:

vc同时支持命令行