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,
再次命令行方式编译出来的静态库仍然不能使用,
和原来的命令行方式编译出来的静态库结果一样
是不是还有什么错漏, 继续请高手帮忙...
这是动态链接库 -- 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 命令行编译静态库的主要内容,如果未能解决你的问题,请参考以下文章