首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Magick++未链接OS Yosemite

Magick++未链接OS Yosemite
EN

Stack Overflow用户
提问于 2015-08-04 11:30:11
回答 1查看 407关注 0票数 0

这个问题已经被问过了:没有解决方案的Magick++ not linking in OS X 10.8

这也是我之前提出的两个问题的续篇,我试图让c++图像拼接算法正常工作(第二个问题是不必要的,我应该已经发现了问题,但为了清楚起见)。Using MTL/Boost Library Mac Terminal C++ ::"no such instruction" error when using gcc-4.9 on osx-yosemite

我的问题是我无法正确地将imagemagick链接到我的gcc-4.9编译,如下所示:

代码语言:javascript
复制
$ make
Linking ...
Undefined symbols for architecture x86_64:
  "Magick::Image::write(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)", referenced from:
  FileRender::finish()      in main.o
  "Magick::Image::Image(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)", referenced from:
      planet(char const*) in main.o
      work(int, char**) in main.o
      test_transform(char const*, char const*) in main.o
      test_warp(int, char**) in main.o
      gallery(char const*, char const*) in main.o
      test_extrema(char const*) in main.o
      test_feature(char const*, int) in main.o
      ...
ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status
make: *** [image-stitching] Error 1

我已经尝试了magick page上的建议,这里列出的Undefined symbols for architecture x86_64,以及相当多的其他内容。但是,不幸的是,没有运气。

按照要求,makefile (来自我的第一个链接上的原始项目,带有当前编辑)。

代码语言:javascript
复制
# $File: Makefile
# $Date: Wed Jun 17 20:52:38 2015 +0800

OBJ_DIR = obj
TARGET = image-stitching

INCLUDE_DIR = -Iinclude -I/usr/local/include
DEFINES = -DDEBUG

OPTFLAGS = -O3 -Wall -Wextra

LIBS =
#INCLUDE_DIR += $(shell pkg-config --cflags $(LIBS))

CXXFLAGS = $(INCLUDE_DIR) -fopenmp
CXXFLAGS += $(DEFINES) -std=c++11 $(OPTFLAGS)
CXXFLAGS += $(shell Magick++-config --cxxflags)

LDFLAGS = -fopenmp $(OPTFLAGS)
#LDFLAGS += $(shell pkg-config $(LIBS) --libs)
LDFLAGS += $(shell Magick++-config --ldflags --libs)
LDFLAGS += -L/usr/local/Cellar/libpng/1.6.18/lib
#LDFLAGS += -lImageMagick

CC = g++-4.9
SHELL = bash
ccSOURCES = $(shell find -name "*.cc" | sed 's/^\.\///g')
OBJS = $(addprefix $(OBJ_DIR)/,$(ccSOURCES:.cc=.o))
DEPFILES = $(OBJS:.o=.d)

.PHONY: all clean run

all: $(TARGET)

ifneq ($(MAKECMDGOALS), clean)
sinclude $(DEPFILES)
endif

    $(OBJ_DIR)/%.o: %.cc
        @echo "[cc] $< ..."
        @$(CC) -c $< -o $@ $(CXXFLAGS)

    $(OBJ_DIR)/%.d: %.cc  Makefile
        @mkdir -p $(dir $@)
        @echo "[dep] $< ..."
        @$(CC) $(CXXFLAGS) $(DEFINES) -MM -MT "$(OBJ_DIR)/$(<:.cc=.o)      $(OBJ_DIR)/$(<:.cc=.d)" "$<"  > "$@"


$(TARGET): $(OBJS)
    @echo "Linking ..."
    @$(CC) $(OBJS) -o $@ $(LDFLAGS)
    @echo "done."


clean:
    @rm -rvf $(OBJ_DIR)

run: $(TARGET)
    ./$(TARGET) lenna.png lenna_r.png
EN

回答 1

Stack Overflow用户

发布于 2015-08-04 19:22:50

通常,我需要非常详细地说明clang++,以及使用哪个标准库。

代码语言:javascript
复制
# Switch GCC for clang
CC=clang
# Switch g++ for clang++
CXXS=clang++
# Ensure stdlib is defined
CXXFLAGS += $(DEFINES) -std=gnu++11 -stdlib=libstdc++ $(OPTFLAGS)

如果您计划移植到ImagickMagick 7,请将-Wno-deprecated-register添加到OPTFLAGS

要进行测试,请执行以下操作:

代码语言:javascript
复制
// link_to_lib.cc
#include <iostream>
#include <Magick++.h>

using namespace std;
using namespace Magick;

int main(int argc, const char ** argv) {
    InitializeMagick(*argv);
    Image img("rose:");
    Geometry size = img.size();
    cout << size.width() << "x" << size.height() << endl;
    return 0;
}

并编译并链接到...

代码语言:javascript
复制
clang++ -std=c++11 -stdlib=libstdc++ \
        `Magick++-config --cxxflags` \
        `Magick++-config --libs` \
        link_to_lib.cc -o link_to_lib
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31800178

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档