如何将SKIA库的C 项目链接到Xcode

How to link the Skia library for a C++ project with Xcode

本文关键字:项目 链接 Xcode 库的 SKIA      更新时间:2023-10-16

skia是图形库(skia.org(。文档说明了如何通过git克隆项目后如何构建库。但是该文档尚不清楚该日期,如何使用使用SKIA库的Xcode构建C 项目。

我尝试了文档中写的所有内容,但找不到如何在C Xcode项目中链接Skia库的方法。

如何解决问题:

添加库搜索路径

此屏幕截图显示了如何以及在何处执行这些步骤:

添加Skia库路径图像

  1. 在项目导航器中,单击项目的图标。
  2. 在项目导航器旁边主窗口部左侧的面板中:再次单击您的项目图标以打开项目全局信息和设置。
  3. 在主窗口部门的导航栏中:单击"构建设置"
  4. 确保以下视图过滤器设置为" ALL"并"合并"因此,您不会错过任何设置。
  5. 在选项搜索表中输入"库搜索路径"要找到"库搜索路径"的条目"
  6. 双克里克(Double Klick(条目"库搜索路径"要接收可以在其中指定应链接到库的搜索路径的弹出窗口。
  7. 在弹出窗口中,双击一个空行,输入您之前构建的libskia.a库文件的路径。(注意:我使用静态构建选项来创建静态库。如果要链接动态.so库,则设置略有不同(

静态链接与libskia.a

应与以前的步骤进行以下步骤。

  1. 在选项搜索表中输入"其他链接"要查找"其他链接器标志"的条目"
  2. 在构建项目时,将标志-lskia添加到静态链接libskia.a库。

确保标题包括路径

应与以前的步骤进行以下步骤。

  1. 在选项搜索表中输入"标题搜索"要找到"标题搜索路径"的条目"
  2. 双克里克(Double Klick(入口"标题搜索路径"要接收可以在其中指定应包括的标题文件的搜索路径。添加" [通往SKIA目录的路径(/Skia/include"并在"递归"的右侧设置搜索模式。对于下面的示例应该足够。

添加Skia的Mac OSX特定依赖项

应与以前的步骤进行以下步骤。此屏幕截图显示了在哪里执行以下步骤:

添加Skia Mac OSX特定依赖项图像

  1. 在项目导航器旁边的主窗口部门左侧的面板中:单击目标以打开目标特定信息和设置。
  2. 在主窗口部门的导航栏中:单击"构建阶段"
  3. 在"链接二进制链接与库"下,单击+符号。
  4. 添加以下MAC OSX特定SKIA依赖性:
  • coreservices.framework
  • coregraphics.framework
  • coretext.framework
  • corefoundation.framework

testcode

您可以使用以下示例代码测试这些设置:

#include "SkSurface.h"
#include "SkPath.h"
#include "SkCanvas.h"
#include "SkData.h"
#include "SkImage.h"
#include "SkStream.h"
int main (int argc, char * const argv[]) {
  // hard coded example program parameters
  const char filePath[] = "/Users/[yourUserName]/Desktop/skiaTestImage.png";
  int width = 256;
  int height = 256;
  // create canvas to draw on
  sk_sp<SkSurface> rasterSurface = SkSurface::MakeRasterN32Premul(width, height);
  SkCanvas* canvas = rasterSurface->getCanvas();
  
  // creating a path to be drawn
  SkPath path;
  path.moveTo(10.0f, 10.0f);
  path.lineTo(100.0f, 0.0f);
  path.lineTo(100.0f, 100.0f);
  path.lineTo(0.0f, 100.0f);
  path.lineTo(50.0f, 50.0f);
  path.close();
  
  // creating a paint to draw with
  SkPaint p;
  p.setAntiAlias(true);
  // clear out which may be was drawn before and draw the path
  canvas->clear(SK_ColorWHITE);
  canvas->drawPath(path, p);
  
  // make a PNG encoded image using the canvas
  sk_sp<SkImage> img(rasterSurface->makeImageSnapshot());
  if (!img) { return 1; }
  sk_sp<SkData> png(img->encodeToData());
  if (!png) { return 1; }
  // write the data to the file specified by filePath
  SkFILEWStream out(filePath);
  (void)out.write(png->data(), png->size());
  
  return 0;
}

附录

用端子编译

您可以通过编写制作文件或直接在终端中调用G 编译器来完成相同的操作。这是一个示例:

g++ -std=c++11 main.cpp -framework CoreFoundation -framework 
 CoreGraphics -framework CoreText -framework CoreServices - 
 L[path_to_your_Skia_library]/skia/out/Static_m58 -lskia - 
 I[path_to_your_Skia_library]/skia/include/core - 
 I[path_to_your_Skia_library]/skia/include/config -
 I[path_to_your_Skia_library]/skia/include/utils -
 I[path_to_your_Skia_library]/skia/third_party/externals/sdl/include -
 I[path_to_your_Skia_library]/skia/include/gpu -
 I[path_to_your_Skia_library]/skia/src/gpu -o main

我如何找到解决方案

找到所有这些东西花了我大约12个小时。如果您对最终导致解决方案的步骤感兴趣,我将在此处解释。让我知道。