JNI之——在cmd命令行下编译执行C/C++源文件

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/46604269

一直用java来敲代码,java配置好jre路径之后。在cmd下编译执行。非常方便。

刚好要给一个舍友改下C程序,想到可不能够像java一样在环境变量里配置好C的编译路径呢?

于是上网搜了一下,得到例如以下结果:

一、假设装有VC,那就简单了,由于VC带有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文件找不到的错误了。

三、假设你在编译过程中,出现一下错误:

1、fatal error C1034: stdio.h: no include path set

2、fatal error LNK1104: cannot open file "kernel32.lib

请在我的电脑->属性->高级->环境变量->系统变量中新建系统变量LIB、INCLUDE并设置它们的值为:

(LIB)C:/Program Files/Microsoft SDKs/Windows/v6.0A/Lib;C:/Program Files/Microsoft SDKs/Windows/v5.0/Lib;C:/Program Files/Microsoft Visual Studio 9.0/VC/lib

(INCLUDE)C:/Program Files/Microsoft Visual Studio 9.0/VC/include

Linux系统下编译连接源码的方法:

gcc -g -c test.c -o test    仅仅生成目标文件(.obj文件),没有生成可运行文件(也就是说test是.obj文件)

gcc -g test.c -o test        生成可执行文件(能够通过./test执行程序)

-g:生成调试信息。

GNU 调试器可利用该信息。

-c:仅仅编译并生成目标文件。

(没有中间文件生成和可运行文件。如列表文件、可运行文件)

-o:设置生成的可运行程序的名字为test

上面的命令会产生可运行程序:test

在Terminal中输入:./test 就能够执行该程序了。

操作过程例如以下:

1.在命令行下。先执行vcvars32.bat(此文件在VC安装文件夹/Bin文件夹里,当中设置了环境变量和路径等信息)。

或者,手动改动环境变量:

path=你安装VS的路径/VC98/Bin

lib=你安装VS的路径/VC98/lib;你安装VS的路径/VC98/MFC/lib

include=你安装VS的路径/VC98/include;你安装VS的路径/VC98/MFC/include;你安装VS的路径/VC98/ATL/lib

2.然后直接用CL编译器编译C++程序(如:CL /GX /MT zx.cpp)。

CL常常使用的选项为:

多线程dll(/MD)-动态链接,不包括执行时库文件

多线程(/MT)-静态链接,包括执行时库文件

附:CL 參数,即编译选项例如以下:

-优化-

/O1 最小化空间                                                               /Op[-] 改善浮点数一致性

/O2 最大化速度                                                                /Os 优选代码空间

/Oa 如果没有别名                                                           /Ot 优选代码速度

/Ob<n> 内联展开(默认 n=0)                                            /Ow 如果交叉函数别名

/Od 禁用优化(默认值)                                                       /Ox 最大化选项。(/Ogityb2 /Gs)

/Og 启用全局优化                                                            /Oy[-] 启用框架指针省略

/Oi 启用内部函数

-代码生成-

/G3 为 80386 进行优化                                                           /Gh 启用 _penter 函数调用

/G4 为 80486 进行优化                                                            /GH 启用 _pexit 函数调用

/G5 为 Pentium 进行优化                                                          /GR[-] 启用 C++ RTTI

/G6 对 PPro、P-II、P-III 进行优化                                            /GX[-] 启用 C++ EH (与 /EHsc 同样)

/G7 对 Pentium 4 或 Athlon 进行优化                                      /EHs 启用 C++ EH (没有 SEH 异常)

/GB 为混合模型进行优化(默认)                                                 /EHa 启用 C++ EH(w/ SEH 异常)

/Gd __cdecl 调用约定                                                              /EHc extern "C" 默觉得 nothrow

/Gr __fastcall 调用约定                                                            /GT 生成纤维安全   TLS 訪问

/Gz __stdcall 调用约定                                                               /Gm[-] 启用最小又一次生成

/GA 为 Windows 应用程序进行优化                                        /GL[-] 启用链接时代码生成

/Gf 启用字符串池                                                                     /QIfdiv[-] 启用 Pentium FDIV 修复

/GF 启用仅仅读字符串池                                                             /QI0f[-] 启用 Pentium 0x0f 修复

/Gy 分隔链接器函数                                                                /QIfist[-] 使用 FIST 而不是 ftol()

/GZ 启用堆栈检查(/RTCs)                                                        /RTC1 启用高速检查(/RTCsu)

/Ge 对全部函数强制堆栈检查                                                   /RTCc 转换为较小的类型检查

/Gs[num]   控制堆栈检查调用                                                    /RTCs 堆栈帧执行时检查

/GS 启用安全检查                                                                    /RTCu 未初始化的本地使用方法检查

/clr[:noAssembly] 为公共语言执行库编译

noAssembly - 不产生程序集

/arch:<SSE|SSE2> CPU 结构的最低要求。下面内容之中的一个:

SSE - 启用支持 SSE 的 CPU 可用的指令

SSE2 - 启用支持 SSE2 的 CPU 可用的指令

-输出文件-

/Fa[file] 命名程序集列表文件                                      /Fo<file> 命名对象文件

/FA[sc] 配置程序集列表                                                /Fp<file> 命名预编译头文件

/Fd[file] 命名 .PDB 文件                                              /Fr[file] 命名源浏览器文件

/Fe<file> 命名可运行文件                                          /FR[file] 命名扩展 .SBR 文件

/Fm[file] 命名映射文件

-预处理器-

/AI<dir> 加入到程序集搜索路径                                /Fx 将插入的代码合并到文件

/FU<file> 强制使用程序集/模块                                   /FI<file> 命名强制包括文件

/C 不抽出凝视                                                            /U<name> 移除提前定义宏

/D<name>{=|#}<text> 定义宏                                    /u 移除全部提前定义宏

/E 预处理到 stdout                                                   /I<dir> 加入到包括搜索路径

/EP 预处理到 stdout。没有 #line                             /X 忽略“标准位置”

/P 预处理到文件

-语言-

/Zi 启用调试信息                                                     /Ze 启用扩展(默认)

/ZI 启用“编辑并继续”调试信息                              /Zl 省略 .OBJ 中的默认库名

/Z7 启用旧式调试信息                                              /Zg 生成函数原型

/Zd 仅有行号调试信息                                              /Zs 仅仅进行语法检查

/Zp[n] 在 n 字节边界上包装结构                             /vd{0|1} 禁用/启用 vtordisp

/Za 禁用扩展(暗指 /Op)                                             /vm<x> 指向成员的指针类型

/Zc:arg1[,arg2] C++ 语言一致性。这里的參数能够是:

forScope - 对范围规则强制使用标准 C++

wchar_t - wchar_t 是本机类型,不是 typedef

- 杂项 -

@<file> 选项响应文件                                             /wo<n> 发出一次警告 n

/?, /help 打印此帮助消息                                          /w<l><n> 为 n 设置警告等级 1-4

/c 仅仅编译,不链接                                                  /W<n> 设置警告等级(默认 n=1)

/H<num> 最大外部名称长度                                    /Wall 启用全部警告

/J 默认 char 类型是 unsigned                               /Wp64 启用 64 位port定位警告

/nologo 取消显示版权消息                                  /WX 将警告视为错误

/showIncludes 显示包括文件名称                            /WL 启用单行诊断

/Tc<source file> 将文件编译为 .c                          /Yc[file] 创建 .PCH 文件

/Tp<source file> 将文件编译为 .cpp                   /Yd 将调试信息放在每一个 .OBJ 中

/TC 将全部文件编译为 .c                                       /Yl[sym] 为调试库插入 .PCH 引用

/TP 将全部文件编译为 .cpp                                  /Yu[file] 使用 .PCH 文件

/V<string> 设置版本号字符串                                  /YX[file] 自己主动 .PCH

/w 禁用全部警告                                                    /Y- 禁用全部 PCH 选项

/wd<n> 禁用警告 n                                               /Zm<n> 最大内存分配(默觉得 %)

/we<n> 将警告 n 视为错误

-链接-

/MD 与 MSVCRT.LIB 链接                                   /MDd 与 MSVCRTD.LIB 调试库链接

/ML 与 LIBC.LIB 链接                                        /MLd 与 LIBCD.LIB 调试库链接

/MT 与 LIBCMT.LIB 链接                                     /MTd 与 LIBCMTD.LIB 调试库链接

/LD 创建 .DLL                                                       /F<num> 设置堆栈大小

/LDd 创建 .DLL 调试库                                       /link [链接器选项和库]

关于链接时參数的说明:

VC项目属性→配置属性→C/C++→代码生成→执行时库
能够採用的方式有:多线程(/MT)、多线程调试(/MTd)、多线程DLL(/MD)、多线程调试DLL(/MDd)、单线程(/ML)、单线程调试(/MLd)


Reusable Library


Switch


Library


Macro(s) Defined


Single Threaded


/ML


LIBC


(none)


Static MultiThread


/MT


LIBCMT


_MT


Dynamic Link (DLL)


/MD


MSVCRT


_MT and _DLL


Debug Single Threaded


/MLd


LIBCD


_DEBUG


Debug Static MultiThread


/MTd


LIBCMTD


_DEBUG and _MT


Debug Dynamic Link (DLL)


/MDd


MSVCRTD


_DEBUG, _MT, and _DLL

当中以小写“d”结尾的选项表示的DEBUG版本号的。没有“d”的为RELEASE版本号。大型项目中必需要求全部组件和第三方库的执行时库是统一的,否则将会出现LNK2005井喷。

单线程执行时库选项/ML和/MLd在VS2003以后就被废了。

/MT和/MTd表示採用多线程CRT库的静态lib版本号。该选项会在编译时将执行时库以静态lib的形式全然嵌入。

该选项生成的可执行文件执行时不须要执行时库dll的參加,会获得轻微的性能提升,但终于生成的二进制代码因链入庞大的执行时库实现而变得很臃肿。当某项目以静态链接库的形式嵌入到多个项目,则可能造成执行时库的内存管理有多份。终于将导致致命的“Invalid
Address specified to RtlValidateHeap”问题。另外托管C++和CLI中不再支持/MT和/MTd选项。

/MD和/MDd表示採用多线程CRT库的动态dll版本号,会使应用程序使用执行时库特定版本号的多线程DLL。链接时将依照传统VC链接dll的方式将执行时库MSVCRxx.DLL的导入库MSVCRT.lib链接。在执行时要求安装了对应版本号的VC执行时库可再发行组件包(当然把这些执行时库dll放在应用程序文件夹下也是能够的)。
因/MD和/MDd方式不会将运行时库链接到可运行文件内部,可有效降低可运行文件尺寸。

当多项目以MD方式运作时。其内部会採用同一个堆,内存管理将被简化,跨模块内存管理问题也能得到缓解。

结论:/MD和/MDd将是潮流所趋,/ML和/MLd方式请及时放弃,/MT和/MTd在非必要时最好也不要採用了。

二、单独下载gcc程序,相同的环境变量设置就能够了。

时间: 04-27

JNI之——在cmd命令行下编译执行C/C++源文件的相关文章

如何让Qt程序能在cmd命令行下输出qDebug信息

若让Qt程序能在cmd命令行下输出qDebug()信息, 则在pro文件中增加: WIN32: CONFIG += console 即可. 启动qt程序时会弹出一个cmd框和一个ui框,就可以看到调试信息了.

在CMD命令行下关闭进程的命令

转载: [重要]在CMD命令行下关闭进程的命令━━━━━━━━━━━━━━━━━━━━━━━━━━ 方法一: 在"运行"中输入:ntsd -c q -pn 程序名字(在MS-Dos中的作用是一样的) 方法二: ntsd使用以下参数杀死进程.c:\>ntsd -c q -p PID 只要你能提供进程的PID,那么你就可以干掉进程. 法二: tskill命令 这个命令与tasklist命令是相对应的吧! tasklist命令是显示有哪些进程正在运行! tskill命令是关闭运行中的进

Java初学者:java是如何在命令行下编译运行程序的

我们上文书说到,我们首先安装Java,然后设置Java环境,然后编译运行了一个简单的Java程序,在命令行模式下显示了一个“Hello baby”.那么,为什么呢?发生了什么呢? 首先,下载安装Java就不用问为什么了对吧?所谓巧妇难为无米之炊,没有Java却想用,这不可能的. 其次,为什么我们要那样设置Java的运行环境呢? 因为,目前为止,我只是想在命令行下编译运行java程序,这样一来,你就需要让命令行模式识别java的命令.而命令行下能自动识别的命令,必须我们手动的把命令的路径添加进去.

Linux命令行下编译Android NDK的示例代码

这几天琢磨写一个Android的Runtime用来加速HTML5 Canvas,让GameBuilder+CanTK 不但开发速度快,运行速度也能接近原生应用.所以花了点时间研究 Android NDK,网上的资料都是讲IDE里的编译方法,这里记录一下命令行下的编译方法,供有需要的朋友参考. 这里以编译hello-gl2为例: 0.安装Android NDK/SDK,设置PATH变量(根据具体情况调整) PATH=$PATH:/work/android/android-sdk-linux/pla

hadoop——在命令行下编译并运行map-reduce程序 2

hadoop map-reduce程序的编译需要依赖hadoop的jar包,我尝试javac编译map-reduce时指定-classpath的包路径,但无奈hadoop的jar分布太散乱,根据自己写的程序来一个个指定jar包的位置又太麻烦,于是又尝试修改java的classpath配置文件,结果不知道为什么编译时还是提示找不到jar包,于是只有用最后一劳永逸的方法:把hadoop的所有jar包都copy到java当前classpath寻找的路径文件中: 我的hadoop安装在/usr/loca

命令行窗口编译执行java

1:首先配置java环境变量 新建系统环境变量 名称:JAVA_HOME 内容:D:\Program Files\Java\jdk1.7.0_13    为你jdk所在的文件夹位置 修改path路径 在路径后加入%JAVA_HOME%/bin;%JAVA_HOME%/jre; 验证环境变量是否配置成功: 运行cmd--java+回车 javac +回车 java -version 查看java的版本信息 环境变量成功后会在控制台输出java 主要的执行命令信息 2:例如: 在G盘下新建文件夹a

Node.js(window)基础(1)——用cmd命令行访问某一文件夹下的js文件

一.安装,从官网上下载安装,安装基本一直点击下一步就行.注意:node.js基于Python的,安装node.js之前电脑上要安装Python,最好是Python2.7或2.6. 二.cmd进入命令行,输入node -v,如果显示node.js版本信息,就是安装成功. 参考http://www.liaoxuefeng.com/wiki/001434446689867b27157e896e74d51a89c25cc8b43bdb3000/00143450141843488beddae2a1044c

Atitit.执行cmd 命令行 php

Atitit.执行cmd 命令行 php 1. 执行cmd 命令行,调用系统命令的基础 1 1.1. 实际执行模式 1 1.2. 空格的问题 1 1.3. 中文路径的问题,程序文件读取编码设置 1 1.4. 回显乱码 2 2. exec,system等函数调用系统命令 2 3. php.ini,关掉安全模式safe_mode = off 3 4. 参考 3 1. 执行cmd 命令行,调用系统命令的基础 1.1. 实际执行模式 Processmonitor 检查.得到.. PID: 115372,

JAVA代码在命令行下的编译

p { text-indent: 2em } .main { font-weight: bolder } 目的 跟C++一样,JAVA可以通过命令行直接编译得到字节码文件,并且使用java命令运行.通过JAVA的编译和运行命令只是熟悉一下JAVA的一些特征,包括包和目录,classpath,jar格式:而且在调试小程序的时候其实用命令行是足够的. 但是在进行大型项目的时候还是要用较大的IDE,例如eclipse和NetBeans,显然eclipse是比NetBeans要复杂得多的,这里不说. 主