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 ...
随机推荐
- 解决VC几个编译问题的方法——好用
一.vc网络编程中遇到一个编译问题,原来是少了WSOCK32.LIB. 在 project-->settings-->Link-->Object/Library modules 中加 ...
- EF实体框架之CodeFirst二
在codefirst一中也说了Mapping是实体与数据库的纽带,model通过Mapping映射到数据库,我们可以从数据库的角度来分析?首先是映射到数据库,这个是必须的.数据库里面一般包括表.列.约 ...
- 怎样开发单页面app
groot.view("myview", function (vm, ve) { ve.loada = function () { require("./app/page ...
- Bootstrap3.0学习第十七轮(JavaScript插件——模态框)
详情请查看http://aehyok.com/Blog/Detail/24.html 个人网站地址:aehyok.com QQ 技术群号:206058845,验证码为:aehyok 本文文章链接:ht ...
- JavaScript事件---事件绑定和深入
发文不易,转载传播,请亲注明链接出处,谢谢! 内容提纲: 1.传统事件绑定的问题 2.W3C事件处理函数 3.IE事件处理函数 4.事件对象的其他内容 事件绑定分为两种:一种是传统事件绑定(内联模型, ...
- 写在读ng之前的基础知识----笔记
如果要看angular的代码, 先把这个给看了, 司徒的干货. /******************************************************************* ...
- attempted to assign id from null one-to-one
one-to-one在hibernate中可以用来作为两张表之间的主键关联,这也是hibernate中主键关联的一种用法,这样在一张表中的ID,在生成另外一张表的同时回自动插入到相应的ID字段中去,相 ...
- 【BZOJ 3188】【Coci 2011】Upit Splay模板题
转啊转终于转出来了,然而我的模板跟陈竞潇学长的模板一模一样,还是太弱啊,第一次用指针. #include<cstdio> #include<cstring> #include& ...
- Maven 教程
Maven 教程 序:几次对Maven 的学习,都因为各种原因 而中途切断了,再一次学习的时候,又不得不重新开始,结果发现 又不记得步骤 又找不到对应的文档.别人写的再好,终究比不过自己亲手实践的得出 ...
- Mysql-字段类型
首先统计所有,以表格查看 数字类型 列类型 需要的存储量 TINYINT 1 字节 SMALLINT 2 个字节 MEDIUMINT 3 个字节 INT 4 个字节 INTEGER 4 个字节 BIG ...