macos - Chromium : GN/Ninja - linking to OS X Framework via Build. gn 失败

标签 macos linker chromium ninja

TL:DR - Build.gn 文件中正确调用 Chromium 到第三方 Mac OS X 框架(并另外将其包含在 Contents/Frameworks/应用程序包路径中)的正确调用是什么?

请参阅下面的 Build.gn 和路径设置。


我正在通过第 3 方库添加对视频捕获的支持来自定义 Chrome 浏览器。我修改了现有的 Build.gn 文件来查找我的第三方 deps 并编译我的新源代码。我修改了现有的 Chromium Build.gn 以包含我的新依赖项:

媒体/捕获/视频/mac/DEPS:

include_rules = [
"+third_party/decklink",
"+third_party/Syphon",

]

它正确地找到了我的框架 Syphon 的新 Build.gn:

我的 Build.gn 如下:

if (is_mac) {
 loadable_module("Syphon") {
 lib_dirs = ["//third_party/Syphon/mac/"]
 libs = ["Syphon.framework"]
}

编译可以工作,但如果我尝试使用我所包含的框架中的对象,则构建会失败。我习惯了 OS X/Xcode 上的这些链接错误,但对于 Ninja/GN,我不清楚解决它们的正确方法。

忍者的输出:

注意 - 生成的链接器参数具有正确使用 -L/path/to/third_party/Syphon/mac/的链接器标志,该标志保存 Syphon.framework,但是,-framework 命令找不到 Syphon。

我尝试使用不同的 Build.gn 命令(例如 ldflags),但都导致相同的问题。

谢谢。

 ninja -C out/Default
  ninja: Entering directory `out/Default'
 [4/5095] SOLINK libcapture.dylib libcapture.dylib.TOC
  FAILED: libcapture.dylib libcapture.dylib.TOC 
  if [ ! -e "./libcapture.dylib" -o ! -e "./libcapture.dylib.TOC" ] || otool -l "./libcapture.dylib" | grep -q LC_REEXPORT_DYLIB ; then TOOL_VERSION=1484604693 ../../build/toolchain/mac/linker_driver.py ../../third_party/llvm-build/Release+Asserts/bin/clang++ -shared  -Wl,-install_name,@rpath/"libcapture.dylib" -stdlib=libc++ -arch x86_64 -Werror -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk -mmacosx-version-min=10.9 -Wl,-ObjC -Wl,-rpath,@loader_path/. -Wl,-rpath,@loader_path/../../.. -o "./libcapture.dylib" -Wl,-filelist,"./libcapture.dylib.rsp" -framework AVFoundation -framework CoreFoundation -framework CoreGraphics -framework CoreMedia -framework CoreVideo -framework Foundation -framework IOKit ./libbase.dylib ./libbase_i18n.dylib ./libmedia.dylib ./libskia.dylib ./libdisplay.dylib ./libgfx.dylib ./libicui18n.dylib ./libicuuc.dylib ./libshared_memory_support.dylib ./libbindings.dylib ./libmojo_public_system_cpp.dylib ./libmojo_public_system.dylib ./libdisplay_types.dylib ./libgeometry.dylib ./librange.dylib && { otool -l "./libcapture.dylib" | grep LC_ID_DYLIB -A 5; nm -gP "./libcapture.dylib" | cut -f1-2 -d' ' | grep -v U$$; true; } > "./libcapture.dylib.TOC"; else TOOL_VERSION=1484604693 ../../build/toolchain/mac/linker_driver.py ../../third_party/llvm-build/Release+Asserts/bin/clang++ -shared  -Wl,-install_name,@rpath/"libcapture.dylib" -stdlib=libc++ -arch x86_64 -Werror -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk -mmacosx-version-min=10.9 -Wl,-ObjC -Wl,-rpath,@loader_path/. -Wl,-rpath,@loader_path/../../.. -o "./libcapture.dylib" -Wl,-filelist,"./libcapture.dylib.rsp" -framework AVFoundation -framework CoreFoundation -framework CoreGraphics -framework CoreMedia -framework CoreVideo -framework Foundation -framework IOKit ./libbase.dylib ./libbase_i18n.dylib ./libmedia.dylib ./libskia.dylib ./libdisplay.dylib ./libgfx.dylib ./libicui18n.dylib ./libicuuc.dylib ./libshared_memory_support.dylib ./libbindings.dylib ./libmojo_public_system_cpp.dylib ./libmojo_public_system.dylib ./libdisplay_types.dylib ./libgeometry.dylib ./librange.dylib && { otool -l "./libcapture.dylib" | grep LC_ID_DYLIB -A 5; nm -gP "./libcapture.dylib" | cut -f1-2 -d' ' | grep -v U$$; true; } > "./libcapture.dylib.tmp" && if ! cmp -s "./libcapture.dylib.tmp" "./libcapture.dylib.TOC"; then mv "./libcapture.dylib.tmp" "./libcapture.dylib.TOC" ; fi; fi
  Undefined symbols for architecture x86_64:
 "_OBJC_CLASS_$_SyphonServerDirectory", referenced from:
  objc-class-ref in video_capture_device_syphon_mac.o
 "_SyphonServerDescriptionAppNameKey", referenced from: media::VideoCaptureDeviceSyphonMac::EnumerateDevices(std::__1::vector<media::VideoCaptureDeviceDescriptor, std::__1::allocator<media::VideoCaptureDeviceDescriptor> >*) in video_capture_device_syphon_mac.o "_SyphonServerDescriptionNameKey", referenced from:media::VideoCaptureDeviceSyphonMac::EnumerateDevices(std::__1::vector<media::VideoCaptureDeviceDescriptor, std::__1::allocator<media::VideoCaptureDeviceDescriptor> >*) in video_capture_device_syphon_mac.o
  ld: symbol(s) not found for architecture x86_64
  clang: error: linker command failed with exit code 1 (use -v to see invocation)
  Traceback (most recent call last):
  File "../../build/toolchain/mac/linker_driver.py", line 229, in <module>
Main(sys.argv)
  File "../../build/toolchain/mac/linker_driver.py", line 79, in Main
subprocess.check_call(compiler_driver_args)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 540, in check_call
raise CalledProcessError(retcode, cmd)
  subprocess.CalledProcessError: Command '['../../third_party/llvm-build/Release+Asserts/bin/clang++', '-shared', '-Wl,-install_name,@rpath/libcapture.dylib', '-stdlib=libc++', '-arch', 'x86_64', '-Werror', '-isysroot', '/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk', '-mmacosx-version-min=10.9', '-Wl,-ObjC', '-Wl,-rpath,@loader_path/.', '-Wl,-rpath,@loader_path/../../..', '-o', './libcapture.dylib', '-Wl,-filelist,./libcapture.dylib.rsp', '-framework', 'AVFoundation', '-framework', 'CoreFoundation', '-framework', 'CoreGraphics', '-framework', 'CoreMedia', '-framework', 'CoreVideo', '-framework', 'Foundation', '-framework', 'IOKit', './libbase.dylib', './libbase_i18n.dylib', './libmedia.dylib', './libskia.dylib', './libdisplay.dylib', './libgfx.dylib', './libicui18n.dylib', './libicuuc.dylib', './libshared_memory_support.dylib', './libbindings.dylib', './libmojo_public_system_cpp.dylib', './libmojo_public_system.dylib', './libdisplay_types.dylib', './libgeometry.dylib', './librange.dylib']' returned non-zero exit status 1
 [13/5095] CXX obj/third_party/WebKit/Source/wtf/wtf_unittests/ListHashSetTest.o
  ninja: build stopped: subcommand failed.

最佳答案

ldflags 是技巧,传递 -F 来更新框架搜索路径(不是使用 -L 或 lib_dirs 命令的库路径)

if (is_mac) {
 loadable_module("Syphon") {
 ldflags = ["-F"+"../../third_party/Syphon/mac/"]
 libs = ["Syphon.framework"]
}

关于macos - Chromium : GN/Ninja - linking to OS X Framework via Build. gn 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41747187/

相关文章:

static - 与静态库与单个目标文件的链接

c++ - 链接 libc-dbg 和 libc-prof

google-chrome - 将 AzureDevOps 搜索添加为 Chrome/Chromium 'Other search engine'

mysql - 如何使用 mysql-client 从 mac 连接到 mysql url

macos - 如何卸载 docker-compose?

c - 从 GCC 链接到 winmm.dll

python - selenium.common.exceptions.WebDriverException : Message: unknown error: DevToolsActivePort file doesn't exist with chromium browser and Selenium Python

javascript - 有没有办法使用以前的 Chrome 版本?

macos - 单击按钮时应用程序崩溃

objective-c - 如何在多个类中使用同一个类别?