8

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

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

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

./configure
make

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

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

4

3 回答 3

4

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

这是 CMakeLists.txt 文件的相关部分(对于 CMake,请参见此处):

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()

如果您的应用程序是用 C++11 构建的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行中添加任何内容。

于 2013-09-15T09:16:49.397 回答
3

不幸的是,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 问题跟踪器中提交一个错误,要求 XCode 项目也构建这个静态库。这不会是一个困难的补丁。

于 2011-03-23T16:36:40.290 回答
0

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

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

结帐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 .
于 2021-09-22T00:08:51.797 回答