在XCode C++应用程序中使用ImageMagick的问题

use*_*205 0 c++ xcode imagemagick magick++

我试图使用ImageMagick将图像加载到我的C++应用程序中; 我在XCode 7中开发.我正在努力.这是我的代码.

#include "Magick++.h"

int main(int argc, const char * argv[]) {
  Magick::Image img;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

我得到的错误如下.

Ld /Users/ndwork/Library/Developer/Xcode/DerivedData/clsFusion-ghktzemmmuxtfidyywslbqxztyqz/Build/Products/Debug/clsFusion normal x86_64
    cd /Users/ndwork/Desktop/clsFusion
    export MACOSX_DEPLOYMENT_TARGET=10.11
    /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++ -arch x86_64 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk -L/Users/ndwork/Library/Developer/Xcode/DerivedData/clsFusion-ghktzemmmuxtfidyywslbqxztyqz/Build/Products/Debug -L/opt/X11/lib -F/Users/ndwork/Library/Developer/Xcode/DerivedData/clsFusion-ghktzemmmuxtfidyywslbqxztyqz/Build/Products/Debug -filelist /Users/ndwork/Library/Developer/Xcode/DerivedData/clsFusion-ghktzemmmuxtfidyywslbqxztyqz/Build/Intermediates/clsFusion.build/Debug/clsFusion.build/Objects-normal/x86_64/clsFusion.LinkFileList -mmacosx-version-min=10.11 -Xlinker -no_deduplicate -stdlib=libc++ -lX11.6 -Xlinker -dependency_info -Xlinker /Users/ndwork/Library/Developer/Xcode/DerivedData/clsFusion-ghktzemmmuxtfidyywslbqxztyqz/Build/Intermediates/clsFusion.build/Debug/clsFusion.build/Objects-normal/x86_64/clsFusion_dependency_info.dat -o /Users/ndwork/Library/Developer/Xcode/DerivedData/clsFusion-ghktzemmmuxtfidyywslbqxztyqz/Build/Products/Debug/clsFusion

Undefined symbols for architecture x86_64:
  "Magick::Image::Image()", referenced from:
      _main in main.o
  "Magick::Image::~Image()", referenced from:
      _main in main.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Run Code Online (Sandbox Code Playgroud)

您可以看到我已经包含了Magick ++.h位于标题搜索路径中的目录.我不知道如何解决这个问题.我用自制软件安装了ImageMagick.

所有帮助表示赞赏!

Mar*_*ell 5

如果您没有homebrew名为pkg-configinstalled 的软件包,请首先安装:

brew install pkg-config
Run Code Online (Sandbox Code Playgroud)

然后它可以告诉你如何编译和链接它知道的所有包,所以让我们看看它知道的包:

pkg-config --list-all | grep -i Magick
Run Code Online (Sandbox Code Playgroud)

样本输出

...
...
libswscale                          libswscale - FFmpeg image rescaling library
ImageMagick                         ImageMagick - ImageMagick - convert, edit, and compose images (ABI Q16HDRI)
vips-cpp                            vips-cpp - C++ API for vips8 image processing library
lept                                leptonica - An open source C library for efficient image processing and image analysis operations
MagickCore-7.Q16HDRI                MagickCore - MagickCore - C API for ImageMagick (ABI Q16HDRI)
MagickWand                          MagickWand - MagickWand - C API for ImageMagick (ABI Q16HDRI)
gdk-pixbuf-2.0                      GdkPixbuf - Image loading and scaling
OpenEXR                             OpenEXR - OpenEXR image library
vips                                vips - Image processing library
Magick++                            Magick++ - Magick++ - C++ API for ImageMagick (ABI Q16HDRI)
...
...
Run Code Online (Sandbox Code Playgroud)

好的,Magick++看起来对你不错.让我们找到头文件路径(for #includes):

pkg-config --cflags-only-I Magick++
Run Code Online (Sandbox Code Playgroud)

样本输出

-I/usr/local/Cellar/imagemagick/HEAD-a781824/include/ImageMagick-7
Run Code Online (Sandbox Code Playgroud)

和链接器标志 - 这实际上是你的问题:

pkg-config --libs Magick++
Run Code Online (Sandbox Code Playgroud)

样本输出

-L/usr/local/Cellar/imagemagick/HEAD-a781824/lib -lMagick++-7.Q16HDRI -lMagickWand-7.Q16HDRI -lMagickCore-7.Q16HDRI
Run Code Online (Sandbox Code Playgroud)

显然,您的值将根据您使用ImageMagick构建的构建时选项而有所不同 - 因此请使用您自己的值,而不是我的.

现在你只需要把它们放到Xcode中 - 所以按顺序点击红色方框,然后编辑你在上面学到的细节,即:

  • 标题搜索路径
  • 图书馆搜索路径
  • 要链接的库

在此输入图像描述

您还应该按照以下建议定义相同的定义:

pkg-config --cflags-only-other Magick++
Run Code Online (Sandbox Code Playgroud)

样本输出

-DMAGICKCORE_HDRI_ENABLE=1 -DMAGICKCORE_QUANTUM_DEPTH=16
Run Code Online (Sandbox Code Playgroud)

在一个你满意的地方.