小编deu*_*ger的帖子

用于C++持续集成的buildbot vs hudson/jenkins

我目前正在使用jenkins/hudson进行持续集成,主要是一个C++项目.我们为主干和每个分支都有单独的项目.此外,还有一些Java代码的相关项目,但是这些项目的设置现在相当基础(我们可能会在稍后做更多).C++项目执行以下操作:

  • 使用选项构建所有内容,以便重新配置,执行干净的构建或使用新的签出
  • 可选择构建并运行所有测试
  • 可选择使用Valgrind的memcheck运行所有测试
  • 运行cppcheck
  • 生成doxygen文档
  • 发布报告:单元测试,valgrind,cppcheck,编译器警告,SLOC,打开任务和代码覆盖(使用gcov,gcovr和cobertura插件)
  • 每晚或按需部署代码到测试环境和包存储库

一切都可以配置为自动构建,可选配置为按需构建.在下面,有一个bash脚本控制其中的大部分内容,这更依赖于我们的构建系统,它使用automake和autoconf以及自定义bash脚本.

我们开始使用Hudson(当时)因为这是Java人员正在使用的东西,我们只想要夜间构建.从那时起,我们增加了很多,并继续增加更多.在某些方面哈德森很棒,但肯定不理想.

我已经看过其他解决方案了,唯一看起来像是替代品的是buildbot.buildbot会更好地适应这种情况吗?自从我们已经在使用Hudson以来,投资是否值得?为什么?

编辑:有人问为什么我没有发现哈德森/詹金斯是理想的.简短的回答是一切都可以改进.我只是想知道,如果詹金斯是我的使用情况或是否有更好的东西(buildbot?),这将是更容易保持在即使有新的要求上来从长远看目前最好的解决方案.

c++ continuous-integration hudson buildbot jenkins

75
推荐指数
3
解决办法
4万
查看次数

在Eclipse中更改doxygen注释样式

有谁知道如何在Eclipse CDT中编辑用于Doxygen评论的样式?

换句话说,键入/**并enter在函数之前按下一行就会产生类似于:

/**
 * 
 * @param one
 * @param two
 * @return
 */
Foo(int one, int two);
Run Code Online (Sandbox Code Playgroud)

我希望它能给我一些类似的东西:

/**********************************************************************/
///
/// \param one
/// \param two
/// \return
/***********************************************************************/
Foo(int one, int two);
Run Code Online (Sandbox Code Playgroud)

此外,再加上一个,如果任何人知道如何把它绑定到键盘快捷键(如alt- shift- j为Eclipse JDT).

此外,仅供参考,Eclipse CDT支持Doxygen的事实现在似乎是一个基于谷歌的鲜为人知的事实.详情请见此处.通过在"C/C++常规"选项卡中选择"启用项目特定设置"并选择"Doxygen",可以在项目属性下启用Doxygen.我的CDT版本是7.0.1,但我认为这在5.0中可用.

最后,首选项中代码模板下的注释部分无法根据我的测试完成此操作.

编辑: 见这里.似乎评论样式是硬编码的.如果有人发现,我很想知道.我想模板现在是最好的,除非Javadoc风格适合你.

eclipse doxygen eclipse-cdt

29
推荐指数
2
解决办法
2万
查看次数

gcov:从共享库生成.gcda输出?

是否可以通过运行链接到使用--coverage选项构建的共享库的可执行文件来生成gcov数据文件(.gcda文件)?

基本上,我有一个主库,它由多个编译成一个共享库的c ++文件组成,然后是一个名为"test"的子目录,其中包含一个链接到并测试主库的测试程序.一切都编译好,并为库源文件和测试源文件生成.gcno文件..gcda文件只为测试源文件生成,但我真的需要它们用于编译到共享库中的实际源文件.

有任何想法吗?

附加信息:
- 这是所有C++代码
- 一切都是使用由automake生成的make脚本构建的
- 在共享库中
为lib_la_CPPFLAGS和lib_la_LDFLAGS指定了--coverage选项Makefile.am - 为AM_CPPFLAGS和AM_LDFLAGS指定了--coverage选项在测试可执行文件Makefile.am中
- 测试源文件使用Google Test(C++单元测试框架)

编辑:固定间距问题

c++ automake gcc code-coverage gcov

28
推荐指数
1
解决办法
1万
查看次数

C++:使用基类作为接口的实现

在C++中是否可以使用另一个基类在派生类中提供接口(即抽象基类)的实现?

class Base
{
    virtual void myfunction() {/*...*/};
}
class Interface
{
    virtual void myfunction() = 0;
}
class Derived
    : public Base, public Interface
{
    // myfunction is implemented by base
}
Run Code Online (Sandbox Code Playgroud)

上面应该编译,但实际上不起作用.有没有办法达到这个效果?

如果有人关心,想要这个的原因是(对我的应用程序)使用来自另一个项目/命名空间的通用库来提供我的项目中的接口的实现是有意义的.我可以把所有东西都包起来,但这似乎是很多额外的开销.

谢谢.

c++ inheritance

26
推荐指数
3
解决办法
1万
查看次数

C++:包含来自不同命名空间的具有相同名称的多个头文件

如何通过包含与另一个包含的另一个头文件同名的头文件来创建解决方案?

例如:

// src/blah/a.hpp
#ifndef A_HPP
#define A_HPP

namspace blah
{

class A
{
}

}

#endif

// src/blah/b.hpp
#ifndef B_HPP
#define B_HPP

#includes "a.hpp"

namspace blah
{

class B
{
}

}

#endif

// src/foo/a.hpp
#ifndef A_HPP
#define A_HPP

namspace foo
{

class A
{
}

}

#endif

// src/foo/c.hpp
#ifndef C_HPP
#define C_HPP

#includes "../b.hpp"
#includes "a.hpp"       // won't be included due to multiple inclusion prevention

namspace foo
{

class C
{
}

}

#endif
Run Code Online (Sandbox Code Playgroud)

在最后一个头文件中,由于多个包含预处理器保护,因此不会包含a.hpp.真的,这应该没问题,因为类在不同的命名空间中.我意识到,简单的方法是只更改foo/a.hpp的名称或者只是在多重包含守护中给它一个假名.有没有更好的办法?

编辑 我理解你可以通过在#define和#ifndef指令中使用更具描述性的名称来解决这个问题(例如FOO_A_HPP和BLAH_A_HPP),但我想知道这是推荐的还是最好的方法.有些人会建议使用不同的文件名作为更好的解决方案,还是不重要?你会建议使用这个约定: …

c++ header include

7
推荐指数
1
解决办法
1万
查看次数

C++/Boost:编写更强大的sscanf替代品

我想用C++编写一个函数来替换C的sscanf,它将匹配分配给迭代器.

基本上,我想要的东西:

string s = "0.5 6 hello";
std::vector<boost::any> any_vector;
sscanv(s, "%f %i %s", any_vector);
cout << "float: " << any_cast<float>(any_vector[0]);
cout << "integer: " << any_cast<integer(any_vector[1]);
cout << "string: " << any_cast<string>(any_vector[2]);
Run Code Online (Sandbox Code Playgroud)

确切的细节可能会有所不同,但你明白了.任何实施的想法?

到目前为止的选项以及目前的问题:

  • std :: istringstream:没有用于匹配常量表达式的操纵器
  • Boost.Regex:不确定这是否有效,而且看起来要比这更复杂
  • Boost.Spirit:不要认为这适用于动态生成的格式字符串,并且它似乎也更复杂
  • sscanf:它可以工作,但是非标准等,并且使用它会需要很多开销,因为参数的数量是在编译时确定的

c++ boost boost-spirit boost-regex boost-spirit-qi

7
推荐指数
1
解决办法
2677
查看次数

在java中查询打开的文件描述符和限制

有人知道在 Java 中列出当前打开的文件描述符的方法以及打开文件描述符的数量限制吗?

迄今为止我发现的最好的是https://gist.github.com/jtai/5408684,它可以让我打印 Unix FD 系统最大值以及当前打开描述符的数量。我还没有找到一种纯 Java 方式来列出实际打开的文件的路径/名称。我还没有找到一种纯 Java 方法来列出每个进程对打开文件描述符数量的限制。

我主要对 Solaris 和 Linux 平台感兴趣,但纯 java 比必须执行某些东西要好。我知道我可以使用 pfiles(在 Solaris 上)、lsof(在 Linux 上)和 ulimit(在两者上),但我正在寻找更好的东西。

编辑 1:我主要关心当前进程/jvm 的打开描述符的数量以及该 jvm 的限制。系统范围的统计数据和限制也是一个加分项。

java linux solaris lsof

6
推荐指数
0
解决办法
1266
查看次数

C++线程安全摘要

我想根据当前标准和C++ 0x以及实际情况(一般来说,在我的情况下使用gcc 4.5.1)总结C++中的线程安全.

对于STL容器,我的理解是根据当前标准不保证线程安全.虽然在实践中它们对于单个作者,多个读者使用(在gcc和可能是大多数现代编译器上)是线程安全的,但这是真的吗?这是由C++ 11保证的吗?

POD类型怎么样?我知道标准保证什么都没有,但我被告知在实践中,所有这些都是读写的线程安全.当然,即使是像增量运算符那样简单的东西仍然需要同步,因为可能存在多次读取和写入.

我主要对答案感兴趣,但是为什么答案背后的原因会受到赞赏.

c++ multithreading thread-safety c++11

5
推荐指数
2
解决办法
1495
查看次数

使 gcc/g++ 在编译 pwd 中的文件时使用绝对路径进行警告

有没有办法让gcc在打印当前目录下编译的文件中发现的错误时使用绝对路径?

例如,当打印错误时,以下内容会执行我想要的操作:

g++ -I. -I../../.. /home/some/path/somefile.cpp
Run Code Online (Sandbox Code Playgroud)

但我想通过类似的东西来实现同样的目标:

g++ -I. -I../../.. somefile.cpp
Run Code Online (Sandbox Code Playgroud)

我希望警告和错误的格式如下:

/home/some/path/somefile.cpp:299:52: warning: some warning
Run Code Online (Sandbox Code Playgroud)

gcc g++

5
推荐指数
1
解决办法
3449
查看次数