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程序,相同的环境变量设置就能够了。
JNI之——在cmd命令行下编译执行C/C++源文件的更多相关文章
- CMD命令行下编译.Net Visual Studio 项目
有时候我们需要编译.net 的sln解决方案,可是VS打开的速度太慢,可以用命令行进行代替,详细过程如下: 1.开始菜单——>Visual Studio 2017(根据你电脑上安装的VS版本来) ...
- VS2015——命令行下编译、静态库动态库制作以及断点调试
c程序编译流程 程序的基本流程如图: 1. 预处理 预处理相当于根据预处理指令组装新的C/C++程序.经过预处理,会产生一个没有宏定义,没有条件编译指令,没有特殊符号的输出文件,这个文件的含义同原本的 ...
- Python安装后在CMD命令行下出现“应用程序无法启动.............”问题
问题存在之一:系统是刚刚重做的精简版服务器系统(阉割版) AN就是在阿里云上刚开的Windows Server 2008 系统上碰到的 吓尿了都 症状: 正常安装python环 ...
- 在CMD命令行下关闭进程的命令
转载: [重要]在CMD命令行下关闭进程的命令━━━━━━━━━━━━━━━━━━━━━━━━━━ 方法一: 在"运行"中输入:ntsd -c q -pn 程序名字(在MS-Dos ...
- c# 命令行下编译c#文件 // c# file类读写文件
c# 命令行下编译c#文件 2010-03-01 15:02:14| 分类: c# 学习|字号 订阅 在 开始 ——>程序 ——>vstool中打开vs2008命令提示. 通过 ...
- Linux命令行下编译Android NDK的示例代码
这几天琢磨写一个Android的Runtime用来加速HTML5 Canvas,让GameBuilder+CanTK 不但开发速度快,运行速度也能接近原生应用.所以花了点时间研究 Android ND ...
- windows cmd命令行下创建文件和文件夹
在window下无法通过 右键=>新建 命令来创建以点开头的文件和文件夹 比如 .log ,会提示必须输入文件名. 可以通过命令行来创建 新建文件夹 mkdir .vs 新建文件 type NU ...
- win10系统 安装好composer后 cmd 命令行下输入composer提示不是内部或外部的命令,也不是可执行的程序或批处理文件
在 windows CMD 下运行composer 出现错误提示: 不是内部或外部命令,也不是可运行的程序或批处理文件,这是因为没有配置 PATH 环境变量. 以 win10 为例,找到此电脑右击选择 ...
- hadoop——在命令行下编译并运行map-reduce程序 2
hadoop map-reduce程序的编译需要依赖hadoop的jar包,我尝试javac编译map-reduce时指定-classpath的包路径,但无奈hadoop的jar分布太散乱,根据自己 ...
随机推荐
- popen && pclose函数
1. 函数操作: 创建一个管道,调用fork产生一个子进程,关闭管道的不使用端,执行一个shell以运行命令,然后等待命令终止: 2. 函数原型: #include <stdio.h> F ...
- maven修改本地仓库默认路径问题
找到maven本地路径的settings.xml文件,如D:\Program Files\apache-maven-3.0.5\conf\settings.xml: 在settings.xml文件中增 ...
- [ nginx ] 带宽下载限速
nginx上了一个APP提供给用户下载,考虑到带宽占用的问题,决定在nginx上做下载限速处理. 操作系统:Centos6.7 X64 nginx版本:nginx/1.11.3 根据官方文档: 对ng ...
- Ansi,UTF8,Unicode,ASCII编码的区别 ---我看完了 明白了很多
来自:http://blog.csdn.net/xiongxiao/article/details/3741731 ------------------------------------------ ...
- 《Java编程思想》笔记 第十一章 持有对象
1.保存对象引用 1.数组,数组具有固定大小 2.容器类,可自动调节大小 2.容器类 List Set Queue Map 及常用的实现类 2.1 Collection (接口) 保存独立的元素 ...
- int 与 String 与 char 之间的互相转换
int 转 String: //方式一: int i1 = 888; String s1 = Integer.toString(i1); //方式二: int i2 = 888; String s2 ...
- 走进Spark--云计算大数据新一代技术
什么是Spark? 当然这里说的Spark指的是Apache Spark, Apache Spark™ is a fast and general engine for large-scale dat ...
- HDU 6351.Beautiful Now-暴力、全排列、思维 (2018 Multi-University Training Contest 5 1002)
2018 Multi-University Training Contest 5 6351.Beautiful Now 题意就是交换任意两个数字,问你交换k次之后的最小值和最大值. 官方题解: 哇塞, ...
- POJ 1981 Circle and Points (扫描线)
[题目链接] http://poj.org/problem?id=1981 [题目大意] 给出平面上一些点,问一个半径为1的圆最多可以覆盖几个点 [题解] 我们对于每个点画半径为1的圆,那么在两圆交弧 ...
- [BZOJ4530]大融合
LCT维护子树信息 维护两个子树信息,$vinf_x$表示节点$x$的所有轻儿子子树信息,$inf_x$表示以$x$为根的LCT子树(包含虚边)的信息 对$vinf$: access时,断开$x$的原 ...