我正在使用C++ JPEG库(libjpeg),我意识到当某些函数失败时,调用exit()并关闭应用程序.如何覆盖此行为并阻止应用程序关闭libjpeg错误?
我正在为标准的C++ 11引擎寻找一组可移植的发行版,比如`std :: mt19937'(参见http://en.cppreference.com/w/cpp/numeric/random).
引擎实现一致地执行(即在不同平台上生成相同的序列 - 使用Clang和MSVC进行测试),但是分布似乎在不同平台上以不同方式实现.
因此,即使引擎产生相同的序列,似乎分布(例如std::normal_distribution<double>)在不同的平台上不使用相同数量的样本(即产生不同的结果),这在我的情况下是不可接受的.
可能有一个第三方库我可以使用它遵循C++ 11随机模板,但这将在流行的平台上提供一致的值(看看GCC,MSVC和Clang/llvm的支持).
我到目前为止看到的选项是:
我需要制服,正常,毒药和瑞利.
我正在尝试使用atomic_flag实现自旋锁.我知道使用C++ 11我必须初始化atomic_flag变量,但我无法编译它.我的代码看起来像这样:
class SpinLock
{
public:
SpinLock()
:m_flag(ATOMIC_FLAG_INIT) /// syntax error : missing ')' before '{'
{
}
void lock()
{
while (m_flag.test_and_set() == true){}
}
void unlock()
{
m_flag.clear();
}
private:
SpinLock &operator=(const SpinLock &);
private:
std::atomic_flag m_flag;
};
Run Code Online (Sandbox Code Playgroud)
当我编译代码时,我会在'{''之前得到'语法错误:缺失')'.我也看到ATOMIC_FLAG_INIT定义为{0},但是这样写的正确方法是什么呢?
以下编译,但它仍然是线程安全吗?
SpinLock()
{
m_flag.clear();
}
Run Code Online (Sandbox Code Playgroud) 我有一个现有的Visual Studio C++项目.它使用GLUT创建一个主窗口,并使用glut作为右键单击上下文菜单.
我现在要做的就是打开第二个窗口,用作属性检查器来显示和更改某些值.
每个人都建议使用Qt进行GUI开发,但我发现的所有教程都讨论了在Qt创建者中工作或如何从头开始创建Qt项目.
几年前我使用Qt来做类似的事情,将它添加到我的项目中并不是那么困难.
任何人都可以解释,或指向我的教程解释如何做到这一点?
谢谢!
我正在使用cmake生成C++ Xcode项目,但调试信息永远不会生成.每次使用cmake生成项目时,我都必须从构建设置中手动选择"DWARF with dSym file".
使用'SET(CMAKE_CXX_FLAGS_DEBUG"$ {CMAKE_CXX_FLAGS_DEBUG} -g")'没有任何区别.
我也很确定它曾经与XCode 6正常工作(现在使用Xcode 7)
我正在尝试链接来自几个静态库(我自己的库)的所有未引用的符号,用于我的C++ xcode应用程序.我已经尝试了所有与'strip'相关的属性(通过搜索'strip'的属性),但未引用的符号,特别是类,没有链接.
我也尝试了-r链接器标志,但是链接器只会抱怨:'ld:-r和-dead_strip不能一起使用'
我尝试将'-no_dead_strip'添加到链接器标志,但接着只是告诉我'-no_dead_strip'被忽略.
我对'Apple LLVM'和'LLVM GCC'都得到了相同的结果.
所以,我的问题是:我应该使用什么链接器标志或目标属性来关闭所有死代码剥离并强制链接未引用的类?
我在VS2010中有静态库(.lib)并将它链接到我的测试项目.
lib有一个我使用下面的MACRO创建的工厂:
#define REGISTER_FACTORY(mType, my_class) \
class Factory##my_class : public CAbstractFactory\
{\
public:\
Factory##my_class() : CAbstractFactory(mType){}\
CBaseClass *Create()\
{ return new my_class(); }\
};\
static Factory##my_class StaticFactory##my_class;
Run Code Online (Sandbox Code Playgroud)
应该发生的是,在CAbstractFactory中,新工厂被注册mtype.但是当我检查工厂时工厂不存在.
当我使用DLL而不是.lib时,它工作正常.我的猜测是链接器不包含静态变量,因为它没有被引用,或者静态变量甚至没有包含在库中.
如何强制链接器在我的.exe中包含静态库中的所有对象.
我像这样使用宏:
// Register factory that can create CMyObject with ID=100
REGISTER_FACTORY(100, CMyObject);
class CMyObject
{
};
Run Code Online (Sandbox Code Playgroud)
CAbstractFactory如下所示:
class CAbstractFactory {
CAbstractFactory(int id) {
CFactory::instance().add(id, this);
}
}
Run Code Online (Sandbox Code Playgroud)
然后在代码中的其他地方,我使用的主要.exe:
CBaseClass *pObject = CFactory::instance().Create(100);
Run Code Online (Sandbox Code Playgroud)
这将给我一个新的CMyObject.我的想法是,我有许多不同类型的对象,我有一个数据库,其中包含指定我需要的对象类型的id.
100只是一个例子.
确实,我没有直接引用.lib中的任何内容,但我希望能够使用我的工厂创建对象
CFactory类是一个简单的类,它保存所有CAbstractFactory类的寄存器(在映射中),并将create方法委托给正确的工厂.
CFactory &CFactory::Instance()
{
static CFactory instance;
return instance;
} …Run Code Online (Sandbox Code Playgroud) 我正在构建一个由一个主要目标和几个插件(在 OSx 情况下为 dylib)组成的应用程序。我开始std::dynamic_pointer_cast在这个项目上使用来转换和测试我的类层次结构中的特定类型。总的来说,这很有效,并且对于我的应用程序来说已经足够快了。
我现在的问题是,有时dynamic_cast并且dynamic_pointer_cast会在从插件中提取的代码部分失败。我正在使用dlopenwithRTLD_GLOBAL | RTLD_LAZY并且我也在用--export_dynamic链接器标志编译我的主要目标,以确保所有符号都被拉入。但是,当它们不应该时,仍然有一些动态转换失败。
我正在测试的类是多态的(虚拟析构函数)并且typeid(...).name()总是返回一致的结果。然而,在某些情况下,即使 typeid 信息看起来正确,动态转换也会返回 null。
当我为调试而编译时,转换似乎总是成功(没有优化)。
我应该在 OSx(XCode、clang)上使用哪些其他链接器标志,无论是在插件上还是目标上,以确保动态转换在我的情况下正常工作?
是strlen(__FILE__)假设我使用的是最新的编译器(GCC,铛,MSVC) -在编译时评价?