我正在开发一个目前在Linux和uClibc中使用C的嵌入式项目.我们有兴趣将它转移到C++,但我不希望与libstdc ++中的链接相关的开销.我的印象是,如果我们不使用STL中的任何内容,例如iostream或vector,这是可能的.
如何在不链接到libstdc ++的情况下直接编译g ++?
我有一个用Qt Designer编写的表单,其中包含一个QWidget,它被提升为我拥有的自定义小部件.自定义小部件包含几个组合框.我希望表单具有合理的Tab键顺序,焦点从自定义小部件之前的小部件移动,然后通过自定义小部件中的组合框,然后在自定义小部件之后继续到小部件.因此,我将QWidget设置为在Designer中具有选项卡焦点,但自定义窗口小部件无法正确处理焦点.
我可以使用QWidget :: setTabOrder解决这个问题,但这会很麻烦,因为我必须从外部进入自定义小部件.或者,我可以为自定义小部件提供成员函数来设置Tab键顺序.理想情况下应该有一个更简单的方法.在那儿?
我正在研究用Visual Studio 6编写的应用程序(我知道,FML),它使用LoadLibrary和调用DLL中的函数GetProcAddress.较新的代码无法在VC6中编译,需要更新的编译器.DLL有一些构造C++对象的函数,然后VC6程序通过抽象类使用该对象.
这通常很好用,但是当GetProcAddress抛出异常检索的函数时它会遇到问题- 即使在DLL中捕获异常时也是如此.我注意到,当抽象类的方法抛出异常时,这不会发生.在这种情况下,事情正常.
我在这做错了什么?如何使VC6生成代码以正确处理异常?
编辑:这是一个导致程序崩溃的函数示例:
extern "C" __declspec(dllexport) Box* getBox(const char* addr)
{
try {
return createBox(addr);
} catch (std::exception& ex) {
LOG_ERROR("Open failed: " << ex.what());
return 0;
} catch (...) {
LOG_ERROR("Error while opening.");
return 0;
}
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试将boost :: signal的触发包装到boost :: bind对象中.所以我想要的是在调用boost :: function时用一些预先打包的参数调用信号.
我有的是这个:
boost::signals2::signal<void(int)> sig;
boost::function<void()> f = boost::bind(
&(sig.operator()), &sig, 10);
Run Code Online (Sandbox Code Playgroud)
但这不起作用.我收到以下错误:错误:没有匹配函数调用bind(,...
我也试过这个:
boost::function<void()> f = boost::bind(
(void(boost::signals2::signal<void(int)>::*)(int))
&(sig.operator()), &sig, 10);
Run Code Online (Sandbox Code Playgroud)
但后来我得到了"没有上下文类型信息的重载函数的地址".
那么什么是正确的语法?
我最近在CMake项目中添加了一个模块,该模块依赖于我只针对发行版CRT编译的库.在CMakeLists.txt中看起来像这样:
IF(WIN32)
ADD_LIBRARY(mymodule MODULE ${MY_LIBRARY_FILES})
TARGET_LINK_LIBRARIES(mymodule libVendor)
INSTALL(TARGETS mymodule LIBRARY)
ENDIF(WIN32)
Run Code Online (Sandbox Code Playgroud)
如果我尝试使用调试设置在MSVC中编译此模块,则编译失败.所以我想要做的是将它排除在编译和安装在调试配置中.在发布配置中,它将正常使用.用CMake可以做到这一点吗?