设为首页 加入收藏

TOP

Linux/Windows下静态lib和全局变量初始化
2014-11-24 12:02:46 来源: 作者: 【 】 浏览:0
Tags:Linux/Windows 静态 lib 全局 变量 初始

程序链接静态lib时,会将使用到的code部分包含进最终的exe或dll中,如果lib中定义了全局变量,但这个全局变量并没有被其他code使用到,那么最终的exe/dll会执行这个全局变量的定义语句吗?



经过测试,Linux的gcc/g++编译器的处理方法和Windows VS一样。


TestLib.h TestLib.cpp TestLibConsole.cpp 都在同一个目录下。


>g++ -c TestLib.cpp


编译出目标文件:TestLib.o


>ar rcs libTestLib.a TestLib.o


生成静态lib。命名规则以“lib”为前缀。


>g++ TestLibConsole.cpp libTestLib.a -o TestLibConsole


编译TestLibConsole.cpp,链接TestLib.a,生成可执行文件TestLibConsole。


>./TestLibConsole


执行。


[Windows 平台] VS2008


创建TestLib工程,configuration type选择static library(lib)。创建一个简单的类People。


TestLib.h


TestLib.cpp


构造函数打印语句。定义了一个全局变量g_Person。


再创建一个C++ console工程TestLibConsole。链接TestLib(solution property的project dependencies中设置)。


1. 想像中,在load的时候,main函数执行之前,应该初始化g_Person,有输出“Create a new People instance:Lily”,但是没有:(


编译器没有发现对TestLib.lib有任何方式的引用,所以根本没有把相关code包含进最终的TestLibConsole.exe中。


2种方法确认:


1) Notepad++ 打开TestLibConsole.pdb文件,搜索“People”,找不到这个symbol。


2) 用windbg debug,Open Executable... 打开TestLibConsole.exe。


lm (列出加载的模块)


ld * (Load symbols)


lm(这时应该会列出TestLibConsole.pdb了)


x TestLibConsole!*Local* (有输出,命令x是检查symbol)


x TestLibConsole!*People* (没有输出)


(其他windog命令:dv, dt, k)



2. 将“People p("Panda")” 的注释去掉,编译执行,如期输出


Create a new People instance:Lily


Begin TestLibConsole.exe


Create a new People instance:Panda


End TestLibConsole.exe



3. 可是有时候并不想在exe中这么调用lib中的code,可以这么做:


在TestLib.h 增加:


在TestLib.cpp中增加:


这样即使没有“People p("Panda")”,这个语句,也会正确初始化全局变量g_Person。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Android开发之EditText控件 下一篇Linux/Windows中atexit实现机制

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·Libevent C++ 高并发 (2025-12-26 00:49:30)
·C++ dll 设计接口时 (2025-12-26 00:49:28)
·透彻理解 C 语言指针 (2025-12-26 00:22:52)
·C语言指针详解 (经典 (2025-12-26 00:22:49)
·C 指针 | 菜鸟教程 (2025-12-26 00:22:46)