我正在考虑auto在一些跨平台项目(Windows + Mac)中使用一些C++ 11功能(例如).在Windows上,Visual Studio支持即将推出的C++ 11标准的部分内容,这些内容允许我简化部分代码库,因此我很自然地会对开始使用这些功能感兴趣.
但据我所知,目前的XCode版本(3.2.4 + GCC 4.2)根本不支持任何C++ 11功能.我可以以某种方式升级GCC版本或CLang版本吗?或者,我是否应该咬紧牙关,等待Apple将来某个时候打包新版本?
我有一个动态库,根据配置获取不同的名称,在CMake脚本中指定:
set_target_properties(${name} PROPERTIES OUTPUT_NAME ${outputName}64)
set_target_properties(${name} PROPERTIES DEBUG_OUTPUT_NAME ${outputName}64_d)
Run Code Online (Sandbox Code Playgroud)
最终结果是我在发布和调试版本上获得了不同的名称.我想将生成的库复制到另一个目录作为构建后的步骤,但是CMake-Fu的礼物(?)并没有真正对你微笑.
我试过这样做:
GET_TARGET_PROPERTY(origfile mylibrary LOCATION)
STRING(REGEX REPLACE "/" "\\\\" origfile ${origfile})
set(targetfile my_target_path\\${CMAKE_CFG_INTDIR}\\)
STRING(REGEX REPLACE "/" "\\\\" targetfile ${targetfile})
add_custom_command(TARGET mylibrary POST_BUILD
COMMAND copy ${origfile} ${targetfile}
)
Run Code Online (Sandbox Code Playgroud)
这适用于发布版本,但是对于调试,源代码不包括我期望的_d. 如何获取目标的输出路径以便我可以复制文件?
注意:从上面的代码片段可以看出,这是目前用于Windows/Visual Studio的,但我希望这也适用于OS X/Xcode/make.
注意:我需要将库放在一个额外的目录中,该目录充当依赖于此库的其他几个项目的输出目录,以便这些项目能够在运行时加载库.可接受的替代解决方案是能够创建执行复制的自定义目标,以便其他项目可以依赖于此项目,而该项目又依赖于库.
作为我的用户的服务,我想提供一个卸载脚本来完全删除我的应用程序在Mac OS X上的所有痕迹.应用程序使用包安装而不是仅仅被拖入Applications文件夹,因为它是一个守护进程类型应用程序还需要在安装时运行脚本才能启动.
我的想法是包含一个被调用的文件uninstall.sh并将其放入/Library/Application Support/com.<mycompany>.<myapplication>/并从应用程序文档中引用它.目的基本上是在运行,卸载和删除相应的plist以及删除任何应用程序文件时停止守护程序.这听起来合理还是有更好的方法来实现这一目标?
此外,我想知道是否使用删除包的痕迹是一个好习惯pkgutil --forget- 如果我不这样做,下次安装包时它会显示为升级而不是安装.有关最佳实践信息的任何建议或指示?
在OS X上没有标准的方法吗?
我在掌握如何正确处理从多线程程序中以多线程方式使用Boost Asio创建子进程时遇到了一些麻烦.
如果我理解正确,在Unix世界中启动子进程的方法是调用fork()后跟一个exec*().此外,如果我理解正确,调用fork()将复制所有文件描述符等等,这些需要在子进程中关闭,除非标记为FD_CLOEXEC(并因此在调用时原子关闭exec*()).
Boost Asio需要在fork()调用时通知,以便通过调用正确操作notify_fork().但是,在多线程程序中,这会产生几个问题:
如果我理解正确,套接字默认由子进程继承.它们可以设置为SOCK_CLOEXEC- 但不能直接创建*,因此如果从另一个线程创建子进程,则会导致计时窗口.
notify_fork()要求没有其他线程调用任何其他io_service函数,也不要求任何其他任何与该函数关联的I/O对象上的函数io_service.这似乎并不可行 - 毕竟程序是多线程的.
如果我理解正确,任何函数调用之间fork()和exec*()需要异步信号安全(请参阅fork()文档).没有notify_fork()异步信号安全呼叫的文档.事实上,如果我查看Boost Asio的源代码(至少在版本1.54中),可能会调用pthread_mutex_lock,如果我理解正确的话,这不是异步信号安全的(参见Signal Concepts,还有其他调用正在进行中)不在白名单上).
问题#1我可以通过分离子进程和套接字+文件的创建来解决这个问题,这样我就可以确保在创建的套接字和设置之间的窗口中没有创建子进程SOCK_CLOEXEC.问题#2比较棘手,我可能需要确保所有 asio处理程序线程都已停止,执行fork然后再次重新创建它们,这充其量是潮流,并且在最坏的情况下真的很糟糕(我的挂起计时器怎么样? ).问题#3似乎完全无法正确使用它.
如何在多线程程序中与fork()+ 一起正确使用Boost Asio exec*()?
......还是我"分叉"?
如果我误解了任何基本概念,请告诉我(我在Windows编程时提出,而不是*nix ......).
编辑:* - 实际上可以SOCK_CLOEXEC直接在Linux上创建带有set的套接字,自2.6.27起可用(参见socket() …
我发现boost :: signals2使用了一些连接槽的延迟删除,这使得很难将连接用作管理对象生命周期的东西.我正在寻找一种方法来强制插槽在断开连接时直接删除.如何通过不同的方式设计我的代码来解决问题的任何想法也很感激!
这是我的场景:我有一个Command类负责执行异步需要时间的事情,看起来像这样(简化):
class ActualWorker {
public:
boost::signals2<void ()> OnWorkComplete;
};
class Command : boost::enable_shared_from_this<Command> {
public:
...
void Execute() {
m_WorkerConnection = m_MyWorker.OnWorkDone.connect(boost::bind(&Command::Handle_OnWorkComplete, shared_from_this());
// launch asynchronous work here and return
}
boost::signals2<void ()> OnComplete;
private:
void Handle_OnWorkComplete() {
// get a shared_ptr to ourselves to make sure that we live through
// this function but don't keep ourselves alive if an exception occurs.
shared_ptr<Command> me = shared_from_this();
// Disconnect from the signal, ideally deleting the slot object …Run Code Online (Sandbox Code Playgroud) 这里std::make_array提出的功能的当前状态是什么?我找不到有关其潜在接受度的任何信息.根据cppreference.com,它位于命名空间中.在C++编译器支持和Wikipedia-C++ 17,Wikipedia-C++ 20和C++ 17标准草案中都没有提到它.std::experimental
我正在尝试基于主干版本782为Mac OS X 构建Google Breakpad作为移植应用程序的一部分.
Breakpad wiki指定应该构建client/mac/Breakpad.xcodeproj,如果我理解正确,它会产生一个包含动态链接库的Breakpad.framework.还有关于如何在Objective-C应用程序中使用它的示例代码,但所有这些似乎与在其他平台上执行操作的正常方式非常不同,包括使用plist和其他不属于的东西我的申请 我更愿意跨平台做尽可能相似的事情.
例如,这似乎是Firefox使用Breakpad的方式:
// include exception_handler.h from client/<platform>/handler,
// using ... here for brevity
#include "... exception_handler.h"
...
gExceptionHandler = new google_breakpad::
ExceptionHandler(tempPath.get(),
nsnull,
MinidumpCallback,
nsnull,
#if defined(XP_WIN32)
google_breakpad::ExceptionHandler::HANDLER_ALL);
#else
true);
#endif
Run Code Online (Sandbox Code Playgroud)
在我的项目中,我们正在做同样的事情,只是exception_handler.lib在Windows上链接.似乎在Linux上,Breakpad libbreakpad_client.a会以相同的方式生成相应的链接,但不能在Mac OS X上生成.如果我这样做的话
./configure
make
Run Code Online (Sandbox Code Playgroud)
从breakpad根目录libbreakpad.a生成一个不包含异常处理程序的,以及应该没有构建的libbreakpad_client.a.我很可能误解了使用Breakpad的正常方式以及在Mac上构建外部库的正常程序,所以任何帮助都会受到赞赏.
我如何libbreakpad_client.a在Mac OS X上构建?
我正在将使用Visual Studio 2005创建的C++项目转换为CMake,并且偶然发现了项目中包含的资源文件的一些问题.
该项目包括一个.rc文件,一堆.ico文件和一个.rc2文件.
常规.rc文件在生成的项目中正常工作并使用资源编译器.在.ico和.rc2文件时,刚刚被列入他们,因为在生成的项目Visual Studio中尝试使用C/C++编译器编译不过它们是造成问题.
我假设这些文件包含在.rc文件中,因此它可能只是不将它们包含在CMakeLists.txt文件中,但是因为显然可以在项目中列出它们(它们在原始项目中可见)我我希望这样做,以便生成的项目的用户可以看到正在使用这些文件.
在CMake中处理这些额外VS资源文件的正确方法是什么?
我在OS X上遇到了Boost Asio的问题,其中io_service析构函数有时会无限期挂起.我有一个相对简单的repro案例:
#include <boost/asio.hpp>
#include <boost/thread.hpp>
int main(int argc, char* argv[]) {
timeval tv;
gettimeofday(&tv, 0);
std::time_t t = tv.tv_sec;
std::tm curr;
// The call to gmtime_r _seems_ innocent, but I cannot reproduce without this
std::tm* curr_ptr = gmtime_r(&t, &curr);
{
boost::asio::io_service ioService;
boost::asio::deadline_timer timer(ioService);
ioService.post([&](){
// This will also call gmtime_r, but just calling that is not enough
timer.expires_from_now(boost::posix_time::milliseconds(1));
timer.async_wait([](const boost::system::error_code &) {});
});
ioService.post([&](){
ioService.post([&](){});
});
// Run some threads
boost::thread_group workers;
for (auto i=0; …Run Code Online (Sandbox Code Playgroud) 将std :: bind与std :: function结合使用时,我无法理解一些细微之处.
我已将问题最小化到以下代码段:
#include <functional>
#include <iostream>
void bar(int x) {
std::cout << "Hello." << std::endl;
}
int main(int argc, char* argv[])
{
std::function<void(int)> f1 = std::bind(bar, std::placeholders::_1);
// CRASHES with clang, works fine in VS2010 and VS2012
std::function<void()> f2 = std::bind(f1, 1);
f2();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
注意显式转换到std ::函数<>(代替std::function<void()>与auto施工时f2工作正常).
f2通过f1在OS X(XCode 5.0.1,OS X 10.9 SDK)上使用Clang 复制对象崩溃创建,但与VS2010/VS2012一起正常工作.在一个非常长的callstack之后,代码崩溃了一个EXC_BAD_ACCESS - 注意这是在构造函数对象时,而不是在调用它时.
这是库实现中的错误还是我的代码有问题?
解决方法是显式调用operator ()成员,如下所示:
std::function<void()> f2 = …Run Code Online (Sandbox Code Playgroud)