您的位置:首页 > 编程语言 > C语言/C++

Windows下用VC++命令行编译c(cl.exe)

2017-08-21 11:13 344 查看
最近在用Cython引用c函数时,经常需要将c编译为静态数据连接库(.lib文件)。踩了一些坑现在都记下来。

搞清楚坏境

编译前需要搞清楚自己的编译环境,对于64位需要使用
VC 64位命令行提示符
。我的环境是:

- Windows 7 64-bit

- Visual studio 2017

所以我使用64位命令提示符。不要用普通的命令行编译,那样很多库和头文件会找不到

我使用的是VC 2017,在开始菜单可以看到VC所提供的命令行提示符。



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


编译结果:



会获得以下文件:

- 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位的命令提示符,那么也会出现这个问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  visual studio c语言