VS的工程链接优化的问题
打算在项目中试试 CATCH 这个测试框架。请同事在工程中进行了试验,结果却出现了一点问题。
CATCH 和 GTest 之类的框架一样,可以直接在 C++ 文件中定义测试函数,就能自动地注册到测试列表中,而不需要显式地“注册”测试函数这样的代码。其实原理很简单,就是定义一个宏(TEST_CASE),这个宏展开以后,会定义一个全局对象,测试函数作为构造函数的参数传入,然后构造函数中做相应的“注册”动作。由于全局变量的构造函数会在Main函数执行之前就执行,所以就可以在 Main 被执行前,把所有的测试函数注册到测试列表中。
CATCH 这个框架用起来非常简单,只需要包含一个 catch.hpp 头文件就可以了。这也是我看中这个框架的原因。虽然说应该是很简单的,但我还是先新建了一个工程进行了测试,在这个工程中,有三个文件,其中一个包含 main 函数,另外两个就是单纯地定义测试函数。一切都非常顺利,两个 test case 都被执行了,而且结果也正确。
- #include "catch.hpp"
- extern unsigned int Factorial(unsigned int number);
- TEST_CASE("Factorials are computed 2", "[factorial]") {
- REQUIRE(Factorial(1) == 1);
- REQUIRE(Factorial(2) == 2);
- REQUIRE(Factorial(3) == 6);
- REQUIRE(Factorial(10) == 3628800);
- }
我的想法是“main函数”定义在一个文件中,其它文件只要愉快地写 TestCase 就可以了,这样分工起来也容易,合并的工作量也极小。

不过当同事在我们正式的开发工程中做同样类似的事的时候,却出问题。他定义在单独文件中的的 Test case 函数总是不能执行。这下我傻眼了。
我把他的工程拷到我的机器上运行,结果也是一样的。有点头疼。后来我注意到一点,当我把断点打在新加的 TEST_CASE 函数中,运行起来以后,这个断点会显示“此断点无法命中”这样的信息。我只好猜测,虽然我每次修改这个文件VS都会重新编译工程,并且也能看到生成的对应的 obj 文件,但这个文件很有可能没有被链接到工程中。因为我们的正式的开发工程比较大,文件很多,可能是因为 VS 在编译大的工程时,自作聪明做了优化,把认为“从来没有用到过的文件”不进行链接。为什么 VS 会认为新增加的 TestCase 文件没有被使用过呢?因为 CATCH 框架(我觉得GTest等也是一样的)的注册方式是隐性的,它定义的全局变量的构造函数中把自己另一个函数关联到整个的 TestCase 表中,然后再在 Main 函数中通过这张 TestCase 函数表来调用所有的测试函数。VS 很可能在这里分析错误,误以为这些函数不会被用到。如果我在这个文件中随便定义一个函数,然后再在其它会执行的函数中调用这个函数,那么 VS 就不会做这个优化了。于是我这么试了一下,TEST_CASE 文件就被执行了。
(优化不是这么容易做的啊~谁把它报给 VS 吧~)
VS的工程链接优化的问题的更多相关文章
- dede内链怎么优化,Dedecms内部链接优化技巧
dede内链怎么优化,dedecms内部链接优化技巧 使用dedecms的过程中发现,可以通过dedecms的文档关键词维护功能.发表文章时候的关键词添加功能(也可以自动获取)以及核心设置里面的是否使 ...
- 痞子衡嵌入式:MCUXpresso IDE下工程链接文件配置管理与自动生成机制
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是MCUXpresso IDE下工程链接文件配置管理与自动生成机制. 痞子衡在 2018 年初写过一个专题 <嵌入式开发文件系列&g ...
- vs工程链接出现error LNK2005...already defined
今天使用vs2008编译工程无错误,链接过程,出现很多这样的错误: error LNK2005: "public: __thiscall std::basic_string<char, ...
- VuePress 博客之 SEO 优化(三)标题、链接优化
前言 在 <一篇带你用 VuePress + Github Pages 搭建博客>中,我们使用 VuePress 搭建了一个博客,最终的效果查看:TypeScript 中文文档. 本篇讲讲 ...
- express工程的优化和请求参数的处理
1.让工程自动刷新 在Express的默认工程中,ejs, jade等模板的改变会立刻被渲染到浏览器中,但是js的改变不能立即刷新.这时候我们要用到一些自动刷新工具, 如 nodemon, super ...
- Listview 异步加载图片之优化篇(有图有码有解释)
在APP应用中,listview的异步加载图片方式能够带来很好的用户体验,同时也是考量程序性能的一个重要指标.关于listview的异步加载,网上其实很多示例了,中心思想都差不多,不过很多版本或是有b ...
- WordPress SEO ☞ WordPress网站终极优化指南
原文地址:http://www.eastdesign.net/wordpress-seo/ 最新消息,东方设计学院 WordPress SEO 系列视频教程正在持续更新中,目前为了不至于让视频传播过于 ...
- 骑士周游问题跳马问题C#实现(附带WPF工程代码)
骑士周游问题,也叫跳马问题. 问题描述: 将马随机放在国际象棋的8×8棋盘的某个方格中,马按走棋规则进行移动.要求每个方格只进入一次,走遍棋盘上全部64个方格. 代码要求: 1,可以任意选定马在棋盘上 ...
- [转]优化Flash性能
原文:http://www.adobe.com/devnet/flash/articles/optimizing-flash-performance.html 翻译:http://bbs.9ria.c ...
随机推荐
- 做leetcode的几点体会分享(转)
1 大部分题目你都是可以自己做出来的.所以,第一遍尽量不要网上找答案: 2 写了的不管通过的,不通过的答案要保存下来.不通过的,也要记录下来哪儿没有通过.很有可能你这次错了,不知道怎么搞过了,下次还是 ...
- c# 模拟get和post
private string HttpPost(string Url, string postDataStr) { HttpWebRequest request ...
- 关于json 与 Request Header 的Content-Type 一些关系。
由于最近遇到关于,ashx文件ajax解析参数的问题.查询网上很多资料后,已经解决. 鉴于网上已经足够多的,关于这个问题的文章.大部分内容来自互联网,我这里只是做一些整理和记录.特此说明并非原创. C ...
- 每个Android开发者都应该了解的资源列表
前言 这是一篇译文,原文地址Resources every Android developer must know,在译文开头,推荐两篇同样适合于Android开发者阅读的资源列表Android开 ...
- [BZOJ 1055][HAOI2008]玩具取名(DP)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1055 分析: 比较难想的dp f[i][j][c]表示i..j能否压缩成字符c 那么怎 ...
- [bzoj 2431][HAOI2009]逆序对数列(递推+连续和优化)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2431 分析: f(i,j)表示前i个数字逆序对数目为j时候的方案数 那么有f(i,j) ...
- 《TCP/IP详解卷1:协议》第19章 TCP的交互数据流-读书笔记
章节回顾: <TCP/IP详解卷1:协议>第1章 概述-读书笔记 <TCP/IP详解卷1:协议>第2章 链路层-读书笔记 <TCP/IP详解卷1:协议>第3章 IP ...
- jQuery使用之(三)处理页面的元素
对于页面的元素,在DOM编程中可以通过各种查询.修改手段进行管理,非常麻烦.jQuery提供了一整套的方法来处理页面的元素.包括元素的内容.复制.移动和替换等.本节将介绍一些常用的内容. 1.直接获取 ...
- Javascript写入txt和读取txt文件示例
1. 写入 FileSystemObject可以将文件翻译成文件流. 第一步: 例: 复制代码 代码如下: Var fso=new ActiveXObject(Scripting.FileSystem ...
- centos 6.5下安装mysql+nginx+redmine 3.1.0 笔记
centos 6.5下安装mysql+nginx+redmine 3.1.0 笔记 目录[-] 过程 1.安装RVM 2.利用rvm安装 Ruby 1.9.3 并设为默认 3.安装rails 4.安装 ...