小编Vol*_*ire的帖子

使用Visual Studios C++清单文件

我写了一些代码,利用开源库来完成一些繁重的工作.这项工作是在linux中完成的,使用单元测试和cmake来帮助将其移植到Windows.需要在两个平台上运行它.

我喜欢Linux,我喜欢cmake,我喜欢自动生成可视化工作室文件.就像现在一样,在Windows上,一切都将编译,它将链接,它将生成测试可执行文件.

然而,为了达到这一点,我不得不与Windows斗争几天,学习所有关于清单文件和可再发行组件包.

据我所知:

在VS 2005中,微软创建了Side By Side dlls.这样做的动机是,之前,多个应用程序将安装相同dll的不同版本,导致先前安装和正在运行的应用程序崩溃(即"Dll Hell").并排dll修复此问题,因为现在每个可执行文件/ dll附加一个"清单文件",指定应执行哪个版本.

这一切都很好.应用程序不应再神秘崩溃.然而...

微软似乎每次发布Visual Studio都会发布一套新的系统dll.另外,正如我之前提到的,我是一名试图链接到第三方库的开发人员.通常,这些东西作为"预编译的dll"分发.现在,当使用一个版本的可视工作室编译的预编译dll链接到使用另一个版本的可视工作室的应用程序时会发生什么?

根据我在互联网上看到的内容,发生了不好的事情.幸运的是,我从来没有这么做 - 在运行可执行文件时我一直遇到"MSVCR80.dll not found"问题,因此我开始涉足整个清单问题.

我终于得出结论,使这个工作的唯一方法(除了静态链接一切)是所有第三方库必须使用相同版本的Visual Studios编译 - 即不使用预编译的dll - 下载源,构建一个新的DLL并使用它.

这实际上是真的吗?我错过了什么?

此外,如果情况确实如此,那么我不禁会认为微软出于各种原因故意这样做.

它不仅会破坏所有预编译的二进制文件,使得使用预编译的二进制文件变得不必要,如果您碰巧为使用第三方专有库的软件公司工作,那么每当他们升级到最新版本的可视化工作室时 - 您的公司必须现在做同样的事情或代码将不再运行.

顺便一下,linux如何避免这种情况?虽然我说我喜欢在它上面进行开发并且我理解链接的机制,但是我没有维护任何应用程序足够长的时间来遇到这种低级别的共享库版本问题.

最后,总结一下:是否可以将预编译的二进制文件与这个新的清单方案一起使用?如果是的话,我的错误是什么?如果不是,那么微软是否真的认为这会让应用程序开发变得更容易?

更新 - 一个更简洁的问题:Linux如何避免使用Manifest文件?

c++ dll manifest visual-studio

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

CMake可以生成*不*使用cmake的构建脚本吗?

问题:CMake能否生成不以任何方式使用CMake的构建脚本?如果没有,那么将CMake生成的automake脚本用于不对CMake进行任何检查有多难?

我是CMake的忠实粉丝,我支持我在当前的工作环境中过渡到它的想法.如果我能证明CMake可以生成不需要cmake的automake文件,那么可以简化从当前构建系统到CMake的过渡的一件事情.

很明显,我永远不会想要日常使用它,但是能够轻松创建我们的代码分支,可以从源代码构建而不需要cmake,这将有助于我完成我的案例.

c++ build-process cmake

17
推荐指数
2
解决办法
2471
查看次数

在使用distutils构建时,如何覆盖Cython的默认编译标志?

我正在编译Linux中的一些cython扩展,并注意到从distutils机制构建时默认使用-O2.我想知道是否有一种简单的方法可以将其更改为-O3.

我已尝试在Extension对象上使用extra_compile_args,但这会导致-O2和-O3作为参数传递给gcc.我有点想玩其他深奥的gcc选项,因此希望我能控制编译步骤.一个显而易见的问题是"为什么我不运行cython my.pyx并手动编译结果?".我很乐意,是我的答案......但是从命令行运行时,/ usr/local/bin /中的cython可执行文件会抛出一个DistributionNotFound:Cython == 0.12.1错误.我还没想出那一个.

无论如何,我不确定它是一个cython的东西,一个distutils的东西或一个破坏的apt包装的东西.我只是从ubuntu 11.10 apt repo中抓取了cython(目前正在使用ubuntu 11.10).

distutils cython

15
推荐指数
2
解决办法
5388
查看次数

C++概念检查与继承

使用虚函数和C++继承机制与使用模板和boost概念之间的关系是什么?

似乎可能的重叠很多.也就是说,似乎可以用任何一种方法实现多态行为.那么,何时支持一个而不是另一个呢?

我提出这个问题的原因是因为我有一个模板化容器,容器本身具有层次关系.我想编写使用这些容器的算法,而不关心它是哪个特定的容器.此外,一些算法将受益于知道模板类型满足某些概念(例如,可比较).

所以,一方面,我希望容器具有多态性.另一方面,如果我想正确实现某些算法,我仍然需要使用概念.什么是初级开发人员?

c++ polymorphism templates

8
推荐指数
1
解决办法
1710
查看次数

CUDA全局(如在C中)分配给设备内存的动态数组

因此,我试图编写一些利用Nvidia的CUDA架构的代码.我注意到复制到设备和从设备复制真的是在损害我的整体性能,所以现在我试图将大量数据移动到设备上.

由于这些数据用于众多功能,我希望它是全球性的.是的,我可以传递指针,但我真的想知道在这个例子中如何使用全局变量.

所以,我有想要访问设备分配数组的设备功能.

理想情况下,我可以这样做:

__device__ float* global_data;

main()
{
  cudaMalloc(global_data);
  kernel1<<<blah>>>(blah); //access global data
  kernel2<<<blah>>>(blah); //access global data again
}
Run Code Online (Sandbox Code Playgroud)

但是,我还没弄明白如何创建动态数组.我通过声明如下数组找出了一个解决方法:

__device__ float global_data[REALLY_LARGE_NUMBER];
Run Code Online (Sandbox Code Playgroud)

虽然这不需要cudaMalloc调用,但我更喜欢动态分配方法.

cuda nvidia

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

void*指针的C++替代品(不是模板)

看起来我对C++有一个基本的误解:<

我喜欢多态容器解决方案.谢谢你,因为我引起了我的注意:)


因此,我们需要创建一个相对通用的容器类型对象.它也恰好封装了一些与业务相关的逻辑.但是,我们需要在这个容器中存储基本上任意的数据 - 从原始数据类型到复杂类.

因此,人们会立即跳到模板类的想法并完成它.但是,我注意到C++多态性和模板不能很好地结合在一起.由于存在一些我们将要工作的复杂逻辑,我宁愿坚持使用模板或多态,而不是试图通过同时做两者来对抗C++.

最后,鉴于我想做一个或另一个,我更喜欢多态.我发现更容易表示像"这个容器包含可比类型"这样的约束 - 一个la java.

让我谈到问题的主题:最抽象的是,我想我可以拥有一个"容器"纯虚拟界面,它具有类似于"push(void*data)和pop(void*data)"的东西(用于记录) ,我实际上并没有尝试实现堆栈).

但是,我并不喜欢顶级的void*,更不用说每次我想要为具体容器可以使用的数据类型添加约束时签名都会改变.

总结:我们有相对复杂的容器,有各种方法来检索元素.我们希望能够改变可以进入容器的元素的约束.元素应该与多种容器一起使用(只要它们满足特定容器的约束).

编辑:我还应该提到容器本身需要是多态的.这是我不想使用模板化C++的主要原因.

那么 - 我应该放弃对Java类型接口的热爱并使用模板吗?我应该使用void*并静态地投射一切吗?或者我应该使用一个空类定义"元素"来声明什么,并将其用作"元素"层次结构中的顶级类?

我喜欢堆栈溢出的原因之一是许多响应提供了一些我甚至没有考虑过的其他方法的有趣见解.所以,请提前感谢您的见解和意见.

c++ polymorphism templates pointers

7
推荐指数
4
解决办法
7481
查看次数

CMake链接阶段问题

我目前正在构建一个相当大的应用程序,使用cmake生成跨平台构建脚本。在组合cmake构建脚本的过程中,我发现了gcc链接行排序的痛苦。

基本问题是以错误的顺序包含静态库会导致未使用的库符号被丢弃,随后的依赖库无法找到它们。

因此,我处于cmake生成可以正常编译的Visual Studio构建系统的情况,但是unix makefile会引发各种“未定义符号”错误。我已经解决了这个问题-在add_executable命令中,我两次包含了静态库。

我希望有一种更标准/更好的方式来解决此问题。由于我不是唯一的开发人员,并且大多数常规开发都是在Windows中完成的,所以我真的想要一个与链接顺序无关的CMake脚本。Windows开发人员只是不处理此链接顺序问题。最重要的是,弄清楚正确的顺序将非常困难-我没有那么容易获得的信息,并且有很多静态库(大约70个)。

在互联网上搜索后,我确实了解了-static和-dynamic标志,但是让CMake包含它们并不是显而易见的,gcc抱怨无法找到动态库。

无论如何,我欢迎有关如何做正确事情的建议。

c++ linker cmake

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

在单个主机上运行多个虚拟机

我需要在相对较少的物理主机上运行相对大量的虚拟机.每个虚拟机都没有做太多 - 每个虚拟机只需要运行一个基本的网络服务 - 想想SMTP等.此外,每个上的负载将非常轻.

不幸的是,这些数字类似于5个物理主机上的100个虚拟机.每个主机足够体面 - 核心2与2演出的RAM和1Tb磁盘.但是,我知道只需要获取ubuntu的vmware图像并投入该机器就不会让我接近100个实例,并且会接近20.

那么,这个图像与主机的比例是否有任何希望?此外,哪种虚拟机实现最适合此目的 - 即有效地整体使用资源?我们主要在这里使用vmware,但是如果通过切换到Xen等可以获得显着的性能优势,我相信我们会考虑它.

提前感谢您的见解:)

注意:我们最终使用OpenVZ并且工作得很好.ubuntu模板的默认参数让我们每台机器运行大约40个实例.

performance vmware virtual-machine

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

适用于原始数据类型和复杂数据类型的 C++ 模板析构函数

在一个相关问题中,我询问了有关创建通用容器的问题。使用多态模板似乎是正确的方法。

然而,我一生都无法弄清楚应该如何编写析构函数。我希望分配的内存的所有者是容器,即使示例构造函数接受在T其他点分配的数组(及其维度)。

我希望能够做类似的事情

MyContainer<float> blah();
...
delete blah;
Run Code Online (Sandbox Code Playgroud)

MyContainer<ComplexObjectType*> complexBlah();
...
delete complexBlah;`
Run Code Online (Sandbox Code Playgroud)

我可以做这样的事情吗?我可以在没有智能指针的情况下做到这一点吗?

再次感谢您的投入。

c++ templates

2
推荐指数
1
解决办法
4230
查看次数

Boost Spirit v2 gcc编译错误,它不会显示使用msvc

我最近在windows中写了一些精神解析代码,我最近试图在ubuntu框上构建并遇到了我正在努力解决的编译错误.

经过一些黑客攻击和削减,我设法提出了这个示例代码片段,它表现出相同的行为:

struct FooParser
: spirit::qi::grammar<
    std::string::const_iterator, 
    double(), 
    spirit::qi::ascii::space_type>
{
    FooParser() : FooParser::base_type(a_rule)
    {
        using namespace boost::spirit::qi;
        a_rule = double_;
    }

    spirit::qi::rule<
        string::const_iterator,
        double(),
        spirit::qi::ascii::space_type> a_rule;
};
Run Code Online (Sandbox Code Playgroud)

然后将其传递给phrase_parse,如下所示:

double result;
std::string txt;
FooParser foobar;
//...
if(phrase_parse(txt.begin(), txt.end(), foobar, space, result))
{
//do something
}
Run Code Online (Sandbox Code Playgroud)

编译时,会生成以下错误:

boost/spirit/home/qi/reference.hpp:41: error: no matching function for call to 
‘boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const char*, std::basic_string<char,
 std::char_traits<char>, std::allocator<char> > >, double(), 
boost::proto::exprns_::expr<boost::proto::tag::terminal, 
boost::proto::argsns_::term<boost::spirit::tag::char_code<boost::spirit::tag::space, 
boost::spirit::char_encoding::ascii> >, 0l>, boost::fusion::unused_type, 
boost::fusion::unused_type>::parse(__gnu_cxx::__normal_iterator<char*, 
std::basic_string<char, std::char_traits<char>, std::allocator<char> > >&, const 
__gnu_cxx::__normal_iterator<char*, std::basic_string<char, std::char_traits<char>, 
std::allocator<char> > >&, …
Run Code Online (Sandbox Code Playgroud)

c++ gcc boost

2
推荐指数
1
解决办法
519
查看次数

Google App Engine Bulkloader"意外线程死亡"

我想上传一个moderetly大小的csv文件使用bulkloader功能,谷歌应用程序引擎,它似乎通过与下面的结果死了一些方法:

[INFO    ] Logging to bulkloader-log-20110328.181531
[INFO    ] Throttling transfers:
[INFO    ] Bandwidth: 250000 bytes/second
[INFO    ] HTTP connections: 8/second
[INFO    ] Entities inserted/fetched/modified: 20/second
[INFO    ] Batch Size: 10
[INFO    ] Opening database: bulkloader-progress-20110328.181531.sql3
[INFO    ] Connecting to notmyrealappname.appspot.com/_ah/remote_api
[INFO    ] Starting import; maximum 10 entities per post
...............................................................[INFO    ] Unexpected thread death: WorkerThread-7
[INFO    ] An error occurred. Shutting down...
.........[ERROR   ] Error in WorkerThread-7: <urlopen error [Errno -2] Name or service not known>

[INFO    ] 1740 entites …
Run Code Online (Sandbox Code Playgroud)

python google-app-engine bulkloader

2
推荐指数
1
解决办法
583
查看次数

关于模板类中的模板函数的小问题

我试图理解一些C++语法:

template<class T>
class Foo 
{
   Foo();

   template<class U>
   Foo(const Foo<U>& other);
};

template<class T>
Foo<T>::Foo() { /*normal init*/ }

template<class T>
template<class U>
Foo<T>::Foo(const Foo<U>& other) { /*odd copy constructed Foo*/ }
Run Code Online (Sandbox Code Playgroud)

所以,我编写了这样的代码,它恰好在windows和linux中编译.我不明白的是复制构造函数有两个模板定义的原因.基本上,在我找到正确的语法之前,我必须先解释一下,我想知道为什么特定的语法是正确的,而不是像template<class T, class U>.

c++ templates

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

C++模板滥用问题 - 使用其他类型信息扩充浮动

我有一个想法是由我在boost MTL库的教程中阅读的一些文档激发的.

基本前提是我想使用模板为我提供编译时类型检查错误,否则它们是相同的.

也就是说,假设我有两个测量单位,即Radians和Degrees.获得类型安全最明显的方法是定义2个类:

struct Radian
{
  float rad;
}

struct Degree
{
  float deg;
}
Run Code Online (Sandbox Code Playgroud)

这一切都很好,除了我可以做的事情

func()
{
  Radian r;
  Degree d;

  r.rad = d.deg;
}
Run Code Online (Sandbox Code Playgroud)

如果我可以将这样的赋值标记为编译时类型错误,那将是很好的.这引导我考虑以下内容:

struct Degree {};
struct Radian {};

template <class Data, class Unit>
struct Quantity
{
    Data val;

    Quantity<Data,Unit>() : val() {}
    explicit Quantity<Data,Unit>(Data v) : val(v) {}
};

typedef Quantity<float,Radian> Rad;
typedef Quantity<float,Degree> Deg;
Run Code Online (Sandbox Code Playgroud)

现在,使用Rad和Deg类型的func()的等效代码会将该赋值标记为编译时错误(并且使用显式设置,即使执行像Rad r = 2.0这样简单的操作也被视为编译时错误).

我真正想要的是一个具有这个额外单位属性的浮点数,可用于在编译时捕获逻辑错误(即,在函数中使用度数期望弧度),但是对于所有意图和目的,这些都是浮点数.

作为一般性问题,您对此方法有何看法?我有点担心这是实现我的目标的错误方法,但它有一个奇怪的吸引力.此外,是否有一个"特征"或像升级概念检查,我可以用来确定数据是"漂浮像".最后,有没有什么方法可以继承默认的操作实现,比如"<<",这样我就不必在Quantity类中手动实现所有这些操作了?

c++ templates

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