将静态库与可执行文件链接时,通常会丢弃未引用的符号.在我的例子中,一些未使用的对象用于将它们各自的类注册到工厂中,如果丢弃了对象,则该注册失败.
在我们使用gcc的Unix下,我可以将标志--whole-archive传递给链接器ld(参见下面的ld文档摘录),这使得ld不会丢弃任何对象.Visual C++有这样的东西吗?
--whole归档
对于
`--whole-archive'选项后命令行中提到的每个归档
,请在链接中包含归档中的每个目标文件,而不是在归档中搜索所需的
目标文件.这通常用于将存档文件转换
为共享库,从而强制将每个对象包含在
生成的共享库中.此选项可能不止一次使用.
我只是在即将推出的新c ++标准中使用智能指针.但是我没有掌握shared_from_this函数的用法.这是我有的:
#include <iostream>
#include <memory>
class CVerboseBornAndDie2 : public std::enable_shared_from_this<CVerboseBornAndDie2>
{
public:
std::string m_Name;
CVerboseBornAndDie2(std::string name) : m_Name(name)
{
std::cout << m_Name << " (" << this << ") is born!" << std::endl;
}
virtual ~CVerboseBornAndDie2()
{
std::cout << m_Name << " (" << this << ") is dying!" << std::endl;
}
};
int main(){
CVerboseBornAndDie2* vbad = new CVerboseBornAndDie2("foo");
std::shared_ptr<CVerboseBornAndDie2> p = vbad->shared_from_this();
}
Run Code Online (Sandbox Code Playgroud)
它会在行中抛出一个std :: bad_weak_ptr异常
std::shared_ptr<CVerboseBornAndDie2> p = vbad->shared_from_this();
Run Code Online (Sandbox Code Playgroud)
如果我反而这样做
std::shared_ptr<CVerboseBornAndDie2> p(vbad);
Run Code Online (Sandbox Code Playgroud)
它有效,我可以事后做
std::shared_ptr<CVerboseBornAndDie2> p2 = …Run Code Online (Sandbox Code Playgroud) 我有一个功能
void foo(int *bar)
{}
Run Code Online (Sandbox Code Playgroud)
如果我像这样调用foo,Visual Studio 2012现在将很乐意并且没有警告编译:
int main()
{
foo(false);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我将foo(false)更改为foo(true),则会出现错误:
1>main.cpp(132): error C2664: 'foo' : cannot convert parameter 1 from 'bool' to 'int *'
1> Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast
Run Code Online (Sandbox Code Playgroud)
知道如何确保在传递false时我也会收到错误吗?我唯一的想法是添加第二个私有函数"void foo(bool bar)".然后我确实得到了所谓的错误,声明foo(bool bar)是私有的.但这只适用于从类外部调用foo并且它使我的界面混乱的情况.
我们在企业环境中有一个svn存储库结构,如下所示:
root
libs
shared_lib1
shared_lib2
private_lib
public_code
private_code
Run Code Online (Sandbox Code Playgroud)
其中public_code是一个外部存储库,它是开源的,公司外部的人员具有读写访问权限.shared_lib1和shared_lib2也是与另一家公司的不同程序员组共享的外部存储库.我是维护者,基本上可以做任何技术上最好的,外部用户必须适应.
我现在想知道从这个结构转移到mercurial存储库的最佳方法是什么.
1)我可以使用mercurial子存储库来密切模拟旧的设置.或者
2)我可以为我们制作一个大型仓库,为外部合作伙伴创建三个新的小型独立存储库(基本上是分支项目),并在大型和独立的交换机之间交换变更集.
使用svn中的setup 1),分支是一场噩梦,因为当我分支root时,策略总是必须分支public_code,shared_lib1和shared_lib2.为此,我必须调用svn分支四次并手动修改svn:externals属性三次.我可以轻松地将主仓库分支到mercurial并自动获取所有子仓库的新分支吗?
当我设置2)时,repos之间的文件系统会有所不同.例如,我将在repo"root"中使用public_code/Makefile,但该文件将只是repo"public_code"中的"Makefile".Mercurial仍然能够同步回购之间的变化吗?工作流程怎么样?
我在C++中有一些图像处理代码,它使用霍夫变换算法计算梯度并在其中找到直线.该程序使用浮点数进行大部分计算.
当我在两台不同的计算机上的同一图像上运行此代码时,一台Pentium IV运行最新的Fedora,另一台运行Core i5最新的Ubuntu,32位,我得到的结果略有不同.例如,我对一台机器上的某些变量进行了长时间的计算1.3456f,另一台机器上的变量为1.3457f.这是预期的行为还是我应该在程序中搜索错误?
我的第一个猜测是,我正在访问一些未初始化或超出范围的内存但是我确实通过valgrind运行程序并且它找不到任何错误,同时在同一台机器上运行多次也总是给出相同的结果.
我有一个抽象的C++基类CPlugin.从中可以直接和间接地衍生出许多类.现在给出CPlugin*a,*b我需要找出,如果一个真正的类来自b的真实类.
即我想做这样的事情:
void checkInheritance(CPlugin *a, CPlugin *b){
if (getClass(a).isDerivedFrom(getClass(b)){
std::cout << "a is a specialization from b's class" << std::endl;
}
}
Run Code Online (Sandbox Code Playgroud)
但是如何在C++中实现"getClass"和"isDerivedFrom"?
c++ ×5
branch ×1
c++11 ×1
externals ×1
inheritance ×1
linker ×1
mercurial ×1
pointers ×1
reflection ×1
shared-ptr ×1
subrepos ×1
svn ×1
visual-c++ ×1