vs 命令行编译静态库

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vs 命令行编译静态库相关的知识,希望对你有一定的参考价值。

问题是:使用命令行编译的静态库,不能被其他的vs控制台exe工程使用

具体如下:
工具是vs2010
1. 建立空控制台应用程序工程
test_lib.h:
_declspec(dllexport) void test_print(char* sz_input);

test_lib.cpp:
#include "stdio.h"
#include "test_lib.h"
void test_print(char* sz_input)

printf("%s", sz_input);


2. 修改该工程的工程属性->Configuration Properties->General->Configuration Type->Static library (.lib)

3. vs下编译生成的lib
使用total commander工具的F3查看生成的lib部分如下:
LIBRARY: D:\C++_VS\Console_Study\test_lib\Debug\test_lib.lib

ARCHIVE MEMBER HEADER (00000008):
Name : /
Date : 1279717189 -> 2010/07/21 20:59:49
UserID :
GroupID :
Mode : 0
Size : 62

FIRST LINKER MEMBER
Symbols : 00000002

MbrOffs Name
-------------------- --------------------
00000150 `string'
00000150 void __cdecl test_print(char *)

4. 使用如下命令行方式编译

cl *.cpp /MT /ZI /nologo /W3 /WX- /Od /Oy- /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /Gm /EHsc /RTC1 /GS /fp:precise /Zc:wchar_t /Zc:forScope /Fp"stdafx.h;test_lib.pch" /Fa /Fo /Fd"vc100.pdb" /Gd /analyze- /errorReport:queue /c

lib /OUT:test_lib.lib /NOLOGO *.obj

5. 使用total commander的F3查看"步骤4"生成的lib,部分如下:
LIBRARY: D:\C++_VS\Console_Study\test_lib\Debug\test_lib.lib

ARCHIVE MEMBER HEADER (00000008):
Name : /
Date : 1279716444 -> 2010/07/21 20:47:24
UserID :
GroupID :
Mode : 0
Size : 31

FIRST LINKER MEMBER
Symbols : 00000001

MbrOffs Name
-------------------- --------------------
000000CA void __cdecl test_print(char * __ptr64)

ARCHIVE MEMBER HEADER (00000064):
Name : /
Date : 1279716444 -> 2010/07/21 20:47:24
UserID :
GroupID :
Mode : 0
Size : 41

6. 初步观察结果:
void __cdecl test_print(char *)

void __cdecl test_print(char * __ptr64
不同导致,静态库不能使用

请问达人是不是命令行方式编译的参数设置有错或者有漏???
非常感谢loonie的回答
1. _declspec(dllexport)
当编译生成动态库时,这个表明导出接口
当编译生成静态态库时,这个无效,不影响静态库的编译生成
2. 命令行方式编译是从vs工程拷出来的,具体看下面的插入图片
3. 尝试去掉wchar_t,_MBCS,
再次命令行方式编译出来的静态库仍然不能使用,
和原来的命令行方式编译出来的静态库结果一样
是不是还有什么错漏, 继续请高手帮忙...

参考技术A _declspec(dllexport) void test_print(char* sz_input);
这是动态链接库 -- dllexport ,dll是动态链接库。
不是你说的静态库。
动态链接库,应用程序调用它,编译链接时要有.lib, 运行时要有.dll

Debug\ -- 给别的程序用,要用 Release\,不能用 Debug\

char * __ptr64 sz_input;
__ptr64 -- 32位机上,指针sz_input截断为32位.
char * __ptr32 sz_input;
__ptr32 -- 64位机上,指针sz_input变32位

wchar_t,_MBCS -- 表明你要用双字节字符,那么程序就不应当用 单字节char 型。如果你要编的不是要用双字节字符,那么 就不要 wchar_t,_MBCS。
参考技术B 你可以这样尝试一下

test_lib.h:

#ifdef __cplusplus
extern "C"
#endif
void test_print(char* sz_input);
#ifdef __cplusplus

#endif

vs2019编译ffmpeg4.4为静态库或动态库

参考文章:vs2019编译ffmpeg源码为静态库动态库【完整步骤、亲测可行】

文章目录

编译

直接把博主的项目下下来

我打开里面FFmpeg文件发现它貌似是4.4版本

然后照着他给的步骤执行命令

先找到vs2019的命令行工具

然后执行两个脚本

执行以上两个脚本后,用vs2019打开SMP目录的source\\FFmpeg\\SMP\\ffmpeg_deps.sln编译
可能会出现“加载失败”的项目,直接卸载删除该项目即可。

然后开始编译,比如编译x64版本的lib,不要dll,选Debug,x64

然后按F7生成解决方案,一堆报错,不用管它

ffmpeg_vs2019\\msvc\\lib\\x64目录查看,只要我们这几个静态库文件生成了就行


测试

创建vs项目,把需要的头文件和静态库文件拷过来

头文件源路径:ffmpeg_vs2019\\msvc\\include
静态库文件源路径:ffmpeg_vs2019\\msvc\\lib\\x64

把上述文件分别拷贝到项目的include和lib目录下

头文件我暂时拷了这些:

静态库文件拷了这些:

项目创建代码main.cpp

/*

ffmpeg lib 测试程序

*/

#include <iostream>

extern "C"

#include "libavformat/avformat.h"


#ifdef _DEBUG
#pragma comment(lib, "libavformatd.lib")
#pragma comment(lib, "libavutild.lib")
#else
#pragma comment(lib, "libavformat.lib")
#pragma comment(lib, "libavutil.lib")
#endif

using namespace std;

int main()

    cout << av_version_info() << endl;

    return 0;


项目右键属性配置附加包含目录和附加库目录



然后运行程序,发现成功打印了ffmpeg版本,测试成功

以上是关于vs 命令行编译静态库的主要内容,如果未能解决你的问题,请参考以下文章

使用VS2005编译安装openssl1.1.1c

windows下命令行编译DLL

zlib1.2.11静态编译

VS编译器(cl.exe)命令行编译的例子

VS编译器(cl.exe)命令行编译的例子

vs2019编译ffmpeg4.4为静态库或动态库