在Mac OS X上构建Google Breakpad

8
我正在尝试构建 Google Breakpad 以便将一个应用程序移植到 Mac OS X,基于主干版本 782。 The Breakpad wiki 指定了应该构建 client/mac/Breakpad.xcodeproj,这将生成一个包括动态链接 lib 的 Breakpad.framework,如果我理解正确的话。也有关于如何从 Objective-C 应用程序中使用它的示例代码,但所有这些似乎与其他平台上的常规操作方式非常不同,包括使用 plists 和其他不属于我的应用程序的东西。我更愿意在各个平台之间尽可能地保持相似。
例如,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?

2
你好villintehaspam,能否分享一下你的breakpad源代码,以便在MacOSX下编译?我有一个类似的问题,但是我无法正确使用更新后的makefile;-(。我在stackoverflow上提出了我的问题:http://stackoverflow.com/questions/10450586/qt-google-breakpad-and-macos 谢谢。 - Ludek Vodicka
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()

如果您的应用程序是使用clang -stdlib=libc++构建的(如果您大量使用C++11,则非常正常),则应在xcodebuild行的末尾添加短语GCC_VERSION=com.apple.compilers.llvm.clang.1_0 OTHER_CFLAGS=-stdlib=libc++ OTHER_LDFLAGS=-stdlib=libc++。这将强制xcodebuild执行正确的操作。
如果您的应用程序是使用GCC和GNU libstdc++构建的,则不需要向xcodebuild行添加任何内容。

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项目也构建此静态库。这不是一个难以修复的补丁。


我挖掘了这个线程,但是我该如何使用Makefile.in?有什么工具我应该使用吗?从这些Makefile.in文件开始,获取编译库的过程是什么? - Emidee
值得注意的是,Mozilla已经从其代码库中删除了所有Makefiles,因为他们不再使用make。尽管如此,您仍然可以按照您的建议直接构建源代码,因为它们在moz.build文件中列出为“UNIFIED_SOURCES”。 - zmo

1
我该如何在Mac OS X上构建libbreakpad_client.a?
您只能为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 .

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接