Windows下用VC++命令行编译c(cl.exe)
2017-08-21 11:13
344 查看
最近在用Cython引用c函数时,经常需要将c编译为静态数据连接库(.lib文件)。踩了一些坑现在都记下来。
- Windows 7 64-bit
- Visual studio 2017
所以我使用64位命令提示符。不要用普通的命令行编译,那样很多库和头文件会找不到。
我使用的是VC 2017,在开始菜单可以看到VC所提供的命令行提示符。
![](http://upload-images.jianshu.io/upload_images/7508805-ecf11e4f2a44011a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
使用下面命令将
编译结果:
![](http://upload-images.jianshu.io/upload_images/7508805-0b8e54a298fd7569.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
会获得以下文件:
- sample.dll
- sample.obj
将会得到
cl还有很多的参数,详细参数可以参考官方文档:
cl.exe 参数
下面将
1. 使用了本机位数不一样的命令提示符,例如本机为64位,但是使用了32位;导致你使用的库也是32位。
2. 使用的库版本与编译的环境不一致。举个栗子,现在我使用32位的python编译python扩展函数,但是我使用了64位的命令提示符,那么也会出现这个问题。
搞清楚坏境
编译前需要搞清楚自己的编译环境,对于64位需要使用VC 64位命令行提示符。我的环境是:
- Windows 7 64-bit
- Visual studio 2017
所以我使用64位命令提示符。不要用普通的命令行编译,那样很多库和头文件会找不到。
我使用的是VC 2017,在开始菜单可以看到VC所提供的命令行提示符。
![](http://upload-images.jianshu.io/upload_images/7508805-ecf11e4f2a44011a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
cl.exe
cl.exe是用于在命令行中编译C和C++代码;我安装的是VS 2017,cl 64位版本所在目录为:C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.11.25503\bin\HostX64\x64。可以直接在VS命令提示符中使用,
vcvarsall.bat已经为我们设置好了环境。
使用下面命令将
sample.c文件编译为DLL,动态链接库。
cl /LD sampleD.c
编译结果:
![](http://upload-images.jianshu.io/upload_images/7508805-0b8e54a298fd7569.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
会获得以下文件:
- sample.dll
- sample.obj
通过/out可以指定输出文件名
cl /LD sampleD.c /out:test.dll
将会得到
test.dll文件。
cl还有很多的参数,详细参数可以参考官方文档:
cl.exe 参数
lib.exe编译静态库
如果需要静态链接库,可以使用lib.exe进行编译,命令格式为:
LIB.EXE FILE1.OBJ FILE2.OBJ /OUT:MYLIB.LIB
下面将
cl命令产生的
sample.obj,生成为静态连接库:
lib sample.obj /out:sample.lib
问题检索
error LNK2019: unresolved external symbol
出现link 2019,可能原因:1. 使用了本机位数不一样的命令提示符,例如本机为64位,但是使用了32位;导致你使用的库也是32位。
2. 使用的库版本与编译的环境不一致。举个栗子,现在我使用32位的python编译python扩展函数,但是我使用了64位的命令提示符,那么也会出现这个问题。
相关文章推荐
- Windows下在命令行实现cl.exe编译代码
- 利用vc 6.0目录下的cl.exe直接编译程序的方法
- 几个VS编译器(cl.exe)命令行编译的例子
- VS编译器(cl.exe)命令行编译的例子
- 命令行下cl.exe编译链接的问题及解决方法
- 在Windows下通过命令行界面编译并生成 .exe
- [转载]编译wxWidgets —— windows、vc71、bcc32、MinGW与命令行
- VC++编译时出现Error spawning cl.exe
- C++ -> 在Window7 命令行下使用微软编译工具 cl.exe
- C++ -> 在Window7 命令行下使用微软编译工具 cl.exe
- 利用vc 6.0目录下的cl.exe直接编译程序的方法[整理]
- 几个VS编译器(cl.exe)命令行编译的例子
- 个VS编译器(cl.exe)命令行编译的例子
- cmake 编译opencv 出现 The C++ compiler "C:/Program Files/Microsoft Visual Studio 10.0/VC/bin/cl.exe
- 利用vc 6.0目录下的cl.exe直接编译程序的方法
- VC6.0在Windows7下编译问题:Error spawning cl.exe
- cl.exe,link.exe编译选项以及在windows下编译lua 5.2.2
- 几个VS编译器(cl.exe)命令行编译的例子
- cmake 编译opencv 出现 The C++ compiler "C:/Program Files/Microsoft Visual Studio 10.0/VC/bin/cl.exe
- 利用VC6下VC中cl.exe直接编译源码(转)