2012-10-07 28 views
12

Mam zainstalowany OpenCV z DarwinPorts następujących kierunków tutaj: Compile OpenCV (2.3.1+) for OS X Lion/Mountain Lion with XcodeŁączenie bibliotek OpenCV 2.4.2 na Xcode 4.5.1

mam szukać i próbował każdą inną odmianę tego na Stack Exchange Network i Google, ale to wydaje się znajdź mnie najbliżej.

Wydaje się działać dla niektórych rzeczy, ale nie dla przykładowego kodu dostarczanego z 2.4.2. Zauważ, że dodałem ALL opencv 2.4.2 dylibs Link Binary z bibliotekami.

Na przykład, następujące skompilować i uruchomić:

#include <opencv2/opencv.hpp> 
#include <opencv2/highgui/highgui.hpp> 

int main (int argc, char **argv) 
{ 
    cvNamedWindow("My Window", 1); 
    IplImage *img = cvCreateImage(cvSize(640, 480), IPL_DEPTH_8U, 1); 
    CvFont font; 
    double hScale = 1.0; 
    double vScale = 1.0; 
    int lineWidth = 1; 
    cvInitFont(&font, CV_FONT_HERSHEY_SIMPLEX | CV_FONT_ITALIC, 
      hScale, vScale, 0, lineWidth); 
    cvPutText(img, "Hello World!", cvPoint(200, 400), &font, 
      cvScalar(255, 255, 0)); 
    cvShowImage("My Window", img); 
    cvWaitKey(); 
    return 0; 
} 

Jednak gdy próbuję zbudować żadnej z próbek, takich jak display_image.cpp, przykładowo, w następujący sposób, otrzymuję błędy łącza.

-DOES NIE pracą

#include <stdio.h> 
#include <iostream> 
#include "opencv2/imgproc/imgproc.hpp" 
#include "opencv2/highgui/highgui.hpp" 
#include "opencv2/flann/miniflann.hpp" 

using namespace cv; // all the new API is put into "cv" namespace. Export its content 
using namespace std; 
using namespace cv::flann; 

static void help() 
{ 
    cout << 
    "\nThis program shows how to use cv::Mat and IplImages converting back and forth.\n" 
    "It shows reading of images, converting to planes and merging back, color conversion\n" 
    "and also iterating through pixels.\n" 
    "Call:\n" 
    "./image [image-name Default: lena.jpg]\n" << endl; 
} 

int main(int argc, char *argv[]) 
{ 
    help(); 
    const char* imagename = argc > 1 ? argv[1] : "lena.jpg"; 
    Mat img = imread(imagename); // the newer cvLoadImage alternative, MATLAB-style function 
    if(img.empty()) 
    { 
     fprintf(stderr, "Can not load image %s\n", imagename); 
     return -1; 
    } 
    if(!img.data) // check if the image has been loaded properly 
     return -1; 

    Mat img_yuv; 
    cvtColor(img, img_yuv, CV_BGR2YCrCb); // convert image to YUV color space. The output image will be created automatically 

    vector<Mat> planes; // Vector is template vector class, similar to STL's vector. It can store matrices too. 
    split(img_yuv, planes); // split the image into separate color planes 

    imshow("image with grain", img); 

    waitKey(); 

    return 0; 

} 

otrzymuję następujące błędy:

Undefined symbols for architecture x86_64: 
"cv::split(cv::Mat const&, std::__1::vector<cv::Mat, std::__1::allocator<cv::Mat> >&)", referenced from: 
    _main in main1.o 
"cv::imread(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int)", referenced from: 
    _main in main1.o 
"cv::imshow(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, cv::_InputArray const&)", referenced from: 
    _main in main1.o 
ld: symbol(s) not found for architecture x86_64 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

Każdy pomysł jak rozwiązać ten problem?

+0

Anthony i Marco podali poprawną odpowiedź poniżej. Jest to jedna z tych rzeczy, które po jej doświadczeniu znasz na zawsze. Powinieneś zaakceptować odpowiedź, aby pomóc przyszłym odwiedzającym. – jww

Odpowiedz

0

Spróbuj ręcznie dodać katalog, w którym port umieszcza wszystkie dylibs (/opt/local/lib, jeśli się nie mylę) w Ustawieniach kompilacji-> ścieżce wyszukiwania biblioteki. To powinno naprawić problem z łączeniem.

+0

Dzięki, ale już to zrobiłem. Bez niego pojawia się inny błąd: ld: biblioteka nie została znaleziona dla -lopencv_calib3d.2.4.2 clang: błąd: polecenie linker nie powiodło się z kodem zakończenia 1 (użyj -v, aby zobaczyć wywołanie) – glerg

41

Miałem ten sam problem. Ustawienie domyślne kompilacji wydaje się być inne w Xcode 4.5.

Under "Build Settings" -> Apple LLVM kompilator 4.1 - Język>

C++ Standardowa biblioteka: = Zmiana od libC++ (LLVM ...) do libstdC++ (GNU C++. ..).

+0

Fajnie, dzięki! Mi to pasuje. – tangqiaoboy

+0

To powinna być zaakceptowana odpowiedź :) –

+0

Czy mógłbyś bardziej rozwinąć odpowiedź? Nie rozumiałem, dlaczego musimy zmienić LLVM na GNU C++. @glerg zaakceptuj odpowiedź. – BRabbit27

3

Jest bardzo prawdopodobne, że OpenCV nie zostało skompilowane z ustawieniami C++ 11, podczas gdy program jest. Ustaw strukturę swojego narzędzia bez przełączników C++ 11 (np. -std = C++ 11 -stdlib = libC++).

Powiązane problemy