现在的位置: 首页 > 综合 > 正文

有关静态lib编译的注意点

2018年07月25日 ⁄ 综合 ⁄ 共 1574字 ⁄ 字号 评论关闭

 最近遇到过静态库编译的一些问题 仅此记录下解决方法

1. 原工程为动态库工程,现应要求将其改编成静态库编译

首先新建了一个staticlib工程,将原来的。h.cpp 文件加入到该工程中,

这里比对了下 工程设置 staticlib 中多出一个library 对话框项

c++ 对话框项中的 preprocessor 中 预定义宏出现了  “_LIB”, 

对比两个 dsp工程文件中 

!MESSAGE "Test - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
!MESSAGE "Test - Win32 Win32 Static Lib Debug" (based on "Win32 (x86) Static Library")

另外c++ 的code  Generation 中使用的运行库 也要注意啦, 在应用lib 文件的工程中使用时要注意 使用工程的运行库与lib编译的运行库一致.

 还有一点, 静态库中不应该有main入口函数 否则在应用工程中会出现dllmain 重复定义的错误.

 

 

记录下 #pragma pack() 宏意义

struct sample
{
char a;
double b;
};

若不用#pragma pack(1)和#pragma pack()括起来,则sample按编译器默认方式对齐(成员中size最大的那个)。即按8字节(double)对齐,则sizeof(sample)==16.成员char a占了8个字节(其中7个是空字节)

有个应用静态库的工程是在vs2010 中编译的,使用的运行库是vs2010 的运行库。

而静态库是使用vc6.0的编译时运行库。 在引入lib时 应用工程link时会报错, 主要问题是运行库版本不一致, 后来我使用的vs2010编译的lib静态库. 解决了部分问题。

以摘录百度网友 的《VC编译——link时报重复定义错误》 文章 

 

C Runtime Library

开关

对应的库

版本

/MD

MSVCRT.LIB

多线程DLLRelease版本

/MDd

MSVCRTD.LIB

多线程DLLDebug版本

/MT

LIBCMT.LIB

多线程静态链接的Release版本

/MTd

LIBCMTD.LIB

多线程静态链接的Debug版本

/clr

MSVCMRT.LIB

托管代码和非托管代码混合

/clr:pure

MSVCURT.LIB

纯托管代码

 

C++ Standard Library

开关

对应的库

版本

/MD

MSVCPRT.LIB

多线程DLLRelease版本

/MDd

MSVCPRTD.LIB

多线程DLLDebug版本

/MT

LIBCPMT.LIB

多线程静态链接的Release版本

/MTd

LIBCPMTD.LIB

多线程静态链接的Debug版本

 

编译器会自动根据编译选项,选择对应的LIB文件。一般情况下这不会出现问题。

然而,在部分情况下,一旦你的程序的各个部分(LIB, OBJ…)并非由相同的编译选项编译出,而Link在一起的话,会出现各种各样的看似很难解决的问题,这类问题主要以重复定义的错误形式存在,通常的解决方法也很简单,就是选择同样的编译选项进行编译之后再Link。

 

不同编译库的作用:

1.     LIBCMT:C Runtime库的多线程静态链接的Release版本

2.     LIBCPMT:C++ Standard Library的多线程静态链接的Release版本

3.     MSVCPRTD:C++ Standard Library的多线程DLL的Debug版本

4.     MSVCRTD:C Runtime Library的多线程DLL的Debug版本

 

参考:http://blog.csdn.net/techweb/article/details/1937308

转载:http://blog.csdn.net/ooyyee11/article/details/7357769

抱歉!评论已关闭.