【问题标题】:Building Google Breakpad on Mac OS X在 Mac OS X 上构建 Google Breakpad
【发布时间】:2011-03-23 11:37:42
【问题描述】:

我正在尝试为 Mac OS X 构建Google Breakpad,作为移植应用程序的一部分,基于主干修订版 782。

The Breakpad wiki 指定应该构建 client/mac/Breakpad.xcodeproj,如果我理解正确,它会生成一个包含动态链接库的 Breakpad.framework。还有关于如何在 Objective-C 应用程序中使用它的示例代码,但所有这些似乎与在其他平台上似乎是正常的做事方式非常不同,包括使用 plist 和其他不属于的东西我的申请。我更愿意跨平台做尽可能相似的事情。

例如,this 似乎是 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

在我的项目中,我们正在做同样的事情,只是在 Windows 上链接到 exception_handler.lib。似乎在 Linux 上,Breakpad 生成了一个相应的libbreakpad_client.a,可以以相同的方式链接,但在 Mac OS X 上则不行。如果我这样做

./configure
make

从 breakpad 根目录生成一个不包含异常处理程序的 libbreakpad.a,并且不应该构建 libbreakpad_client.a。我很可能误解了使用 Breakpad 的正常方式以及在 Mac 上构建外部库的正常过程的任何内容,因此感谢您的帮助。

如何在 Mac OS X 上构建 libbreakpad_client.a

【问题讨论】:

  • 你好 villintehaspam,你能分享一下你在 MacOSX 下可以编译的 breakpad 源代码吗?我有一个类似的问题,但我不知道如何正确使用更新的 makefile ;-(。我在这里有我的问题:stackoverflow.com/questions/10450586/… 谢谢。

标签: c++ macos google-breakpad


【解决方案1】:

这可能对您的情况没有帮助,但我发现这适用于我正在从事的需要在 Linux 和 OSX 上运行的项目。在 Linux 上,我们使用“正常”的 autotools 做事方式;在 OSX 上,我们调用 xcodebuild 来创建 Breakpad.framework 然后链接到它。

这是 CMakeLists.txt 文件 (for CMake see here) 的相关部分:

IF(LINUX)
  add_custom_target(
    GOOGLE_BREAKPAD_MAKEFILE
    COMMAND cd ../google-breakpad/ && ([ -e Makefile ] || (autoreconf && bash configure))
  )
  add_custom_target(
    GOOGLE_BREAKPAD
    COMMAND cd ../google-breakpad/ && $(MAKE)
  )
  add_dependencies(GOOGLE_BREAKPAD GOOGLE_BREAKPAD_MAKEFILE)
ENDIF()

IF(APPLE)
  add_custom_target(
    GOOGLE_BREAKPAD
    COMMAND cd ../google-breakpad/src/client/mac/ && xcodebuild -sdk macosx
  )
ENDIF()

如果您的应用程序是使用 clang -stdlib=libc++ 构建的(如果您大量使用 C++11,这很正常),您应该将短语 GCC_VERSION=com.apple.compilers.llvm.clang.1_0 OTHER_CFLAGS=-stdlib=libc++ OTHER_LDFLAGS=-stdlib=libc++ 附加到 xcodebuild 行的末尾。这将迫使 xcodebuild 做正确的事情。

如果您的应用程序是使用 GCC 和 GNU libstdc++ 构建的,则无需在 xcodebuild 行中添加任何内容。

【讨论】:

    【解决方案2】:

    不幸的是,Breakpad 源代码中没有解决方案。 XCode 项目只是构建 Breakpad 框架,因为它是更受支持的客户端 API。您可以使用自己的 Makefile 集或任何您想要的构建设置来构建代码,就像 Firefox 通过查看 Mozilla makefile 集所做的一样:

    http://mxr.mozilla.org/mozilla-central/source/toolkit/crashreporter/google-breakpad/src/common/Makefile.in

    http://mxr.mozilla.org/mozilla-central/source/toolkit/crashreporter/google-breakpad/src/common/mac/Makefile.in

    http://mxr.mozilla.org/mozilla-central/source/toolkit/crashreporter/google-breakpad/src/client/Makefile.in

    http://mxr.mozilla.org/mozilla-central/source/toolkit/crashreporter/google-breakpad/src/client/mac/handler/Makefile.in

    http://mxr.mozilla.org/mozilla-central/source/toolkit/crashreporter/google-breakpad/src/client/mac/crash_generation/Makefile.in

    并收集 CSRCS/CPPSRCS/CMSRCS/CMMSRCS 中引用的文件集,并构建所有这些文件。

    您还可以在Breakpad issue tracker 中提交一个错误,要求 XCode 项目也构建这个静态库。这不会是一个困难的补丁。

    【讨论】:

    • 我正在挖掘这个线程,但是如何使用 Makefile.in?有什么我应该使用的工具吗?从这些 Makefile.in 文件开始编译库的过程是什么?
    • 仅供参考,mozilla 从其存储库中删除了所有 Makefile,因为它们远离了 make。尽管您直接针对源构建的建议仍然存在,因为它们在moz.build 文件中列为UNIFIED_SOURCES
    【解决方案3】:

    如何在 Mac OS X 上构建 libbreakpad_client.a?

    您只能为 macOS Intel64 和 Apple Silicon 构建 dynamic framework

    结帐https://github.com/Sunbreak/cli-breakpad.trial

    获取代码

    mkdir $BREAKPAD && cd $BREAKPAD
    fetch breakpad
    

    设置和构建

    cd $BREAKPAD/src
    ./configure && make
    cd $BREAKPAD/src/client/mac && xcodebuild -target Breakpad
    cd $BREAKPAD/src/tool/mac/dump_syms && xcodebuild -target dump_syms
    

    安装库和工具

    mkdir -p ./breakpad/mac/$(arch)
    cp -r $BREAKPAD/src/src/client/mac/build/Release/Breakpad.framework ./breakpad/mac/
    cp $BREAKPAD/src/src/tools/mac/dump_syms/build/Release/dump_syms ./breakpad/mac/
    cp $BREAKPAD/src/src/processor/minidump_stackwalk ./breakpad/mac/$(arch)
    mkdir Frameworks && cd Frameworks && ln -s ../breakpad/mac/Breakpad.framework .
    

    【讨论】:

      猜你喜欢
      • 2012-12-17
      • 1970-01-01
      • 2012-04-18
      • 2013-04-07
      • 1970-01-01
      • 2015-07-31
      • 2014-02-04
      • 1970-01-01
      • 2013-01-05
      相关资源
      最近更新 更多