2016-09-21 3 views
0

GELÖST: FÜR OpenCV SOLUTION LOOK UP ANTWORT VON Jvinniec FÜR DIE LÖSUNG FAST.H LOOK UP EDITXCode Build-Failed "undefinierte Symbole für Architektur x86_64"

ich mehrere ähnliche Fragen sah auf und hatte keine Lösung finden für meinen Code noch. Der Fehler, den ich bekomme, sieht so aus:

Undefined symbols for architecture x86_64: 
"fast9_score(unsigned char const*, int, xy*, int, int)", referenced from: 
    detectCornersFast(unsigned char const*, int, int, int, int, int*) in main.o 
"fast9_detect(unsigned char const*, int, int, int, int, int*)", referenced from: 
    detectCornersFast(unsigned char const*, int, int, int, int, int*) in main.o 
"nonmax_suppression(xy const*, int const*, int, int*)", referenced from: 
    detectCornersFast(unsigned char const*, int, int, int, int, int*) in main.o 
"cv::namedWindow(cv::String const&, int)", referenced from: 
    _main in main.o 
"cv::GaussianBlur(cv::_InputArray const&, cv::_OutputArray const&, cv::Size_<int>, double, double, int)", referenced from: 
    _main in main.o 
"cv::Mat::deallocate()", referenced from: 
    cv::Mat::release() in main.o 
"cv::Mat::copySize(cv::Mat const&)", referenced from: 
    cv::Mat::operator=(cv::Mat const&) in main.o 
    cv::Mat::Mat(cv::Mat const&) in main.o 
"cv::String::deallocate()", referenced from: 
    cv::String::~String() in main.o 
"cv::String::allocate(unsigned long)", referenced from: 
    cv::String::String(char const*) in main.o 
    cv::String::String(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) in main.o 
"cv::imread(cv::String const&, int)", referenced from: 
    _main in main.o 
"cv::imshow(cv::String const&, cv::_InputArray const&)", referenced from: 
    _main in main.o 
"cv::resize(cv::_InputArray const&, cv::_OutputArray const&, cv::Size_<int>, double, double, int)", referenced from: 
    _main in main.o 
"cv::waitKey(int)", referenced from: 
    _main in main.o 
"cv::fastFree(void*)", referenced from: 
    cv::Mat::~Mat() 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) 

Die Architektur, die ich in XCode verwende, ist Universal. Ich baute und fügte die Suchpfade für openCV und die Fast9-Methoden sind in der Fast.h-Header. Ich habe versucht, die abgeleiteten Daten des Projekts zu löschen, aber nichts half. Hier mein Code des main.cpp:

#include <vector> 
#include <iostream> 
#include <cmath> 
#include <string> 
#include "opencv2/opencv.hpp" 
#include "fast.h" 

using namespace std; 
using namespace cv; 

typedef unsigned char byte; 

Mat src; Mat dst; Mat tmp; 
int rows; int cols; 
byte* image; 
xy* nonmax; 

byte * matToBytes(Mat image){ 

int size = image.total() * image.elemSize(); 
byte * bytes = new byte[size]; 
std::memcpy(bytes, image.data, size * sizeof(byte)); 

return bytes; 

} 

xy* detectCornersFast(const byte* im, int xsize, int ysize, int stride, int b, int* ret_num_corners){ 

xy* corners; 
int num_corners; 
int* scores;  
xy* nonmax; 

corners = fast9_detect(im, xsize, ysize, stride, b, &num_corners); 
scores = fast9_score(im, stride, corners, num_corners, b);  
nonmax = nonmax_suppression(corners, scores, num_corners, ret_num_corners); 

free(corners); 
free(scores); 

return nonmax; 

} 

int main(int argc, const char * argv[]) { 

// insert code here... 

vector<Mat> img; 
vector<int> num_corners; 
vector<xy*> nms; 

src = imread(argv[1],1); 

img.push_back(src); 
double factor = sqrt(2); 

for(int i = 0; i < 5; i++){ 

    int ret_num_corners; 
    rows = src.rows/factor; 
    cols = src.cols/factor; 

    resize(src, tmp, Size(rows,cols),0,0, INTER_NEAREST); 

    GaussianBlur(tmp, dst, Size(5,5),0,0); 

    image = matToBytes(dst); 

    nonmax = detectCornersFast(image, tmp.rows, tmp.cols, tmp.rows, 20, &ret_num_corners); 

    img.push_back(dst); 
    nms.push_back(nonmax); 
    num_corners.push_back(ret_num_corners); 

    src = dst; 

} 

for(int i = 0; i <img.size(); i++){ 

    string name = "Display Window " + std::to_string(i); 
    cout << "Number of Corners" << num_corners[i] << endl; 
    cout << "Nonmax Supression" << nms[i] << endl; 
    namedWindow(name, WINDOW_AUTOSIZE); 
    imshow(name, img[i]); 
} 

waitKey(); 
return 0; 
} 

EDIT: Für OpenCV die Linker Flags aus diesem Tutorial hinzuzufügen geholfen: OpenCV Die Methoden aus schnell in einer C-Datei, die in meinem Projekt ist Mappe. Auch die .h-Datei ist da. Ich poste einfach die .h Datei hier, weil .c File viel zu lang ist, weil es mechanisch erzeugt wird.

LÖSUNG: Es war mein Fehler mit den schnellen Methoden. Ich habe total vergessen, Extern "C" {} in der main.cpp bei #include "fast.h" hinzuzufügen, weil es C-Dateien und nicht C++ - Dateien aufruft.

fast.h

#ifndef FAST_H 
#define FAST_H 

typedef struct { int x, y; } xy; 
typedef unsigned char byte; 

int fast9_corner_score(const byte* p, const int pixel[], int bstart); 

xy* fast9_detect(const byte* im, int xsize, int ysize, int stride, int b, int* ret_num_corners); 

int* fast9_score(const byte* i, int stride, xy* corners, int num_corners, int b); 

xy* fast9_detect_nonmax(const byte* im, int xsize, int ysize, int stride, int b, int* ret_num_corners); 

xy* nonmax_suppression(const xy* corners, const int* scores, int num_corners, int* ret_num_nonmax); 

#endif 
+0

Es würde helfen, die tatsächlichen Befehle zu sehen, die die Fehler erzeugten ...aber es sieht so aus, als ob du nicht mit den Bibliotheken verbindest oder sie sind nicht für x86_64 gebaut. – Dmitri

+0

Das könnte für die schnellen Methoden möglich sein (die in meinem Projektordner sind), aber wenn ich openCV erstelle, konfiguriere ich cmake dass es für x86_64 gebaut wird –

Antwort

2

Es klingt, als ob Sie nur die Header-Suchpfade für diese Abhängigkeiten unter den Projekten hinzufügen haben „Einstellungen Build“ -> „Suchpfade“ -> „User Header-Suchpfade " Feld. Dadurch kann xcode wissen, dass diese Klassen während der Entwicklung vorhanden sind, aber es wird nicht möglich sein, Ihr Projekt zu erstellen. Sie sollten auch sicherstellen, dass Ihr Projekt weiß, wo die Bibliotheken zu finden sind, in denen die von Ihnen verwendeten Symbole openCV und fast9 definiert sind (d. H. Wo die .so Dateien für diese beiden Abhängigkeiten stehen). Dazu können Sie die entsprechenden Linker-Flags unter "Build-Einstellungen" -> "Verknüpfen" -> "Andere Linker-Flags" hinzufügen. Stellen Sie außerdem sicher, dass diese Felder für das TARGET festgelegt sind, das Sie zu kompilieren versuchen, nicht nur für das PROJEKT.

Wenn Sie nicht sicher sind, was die Linker Flags sind, hier ein kurzes Beispiel. Ich möchte folgende Bibliothek verknüpfen:

/path/to/some/project/lib/libfoo.so

Ich würde die folgenden auf die „Andere Linker Flags“ Feld hinzufügen:

-L/path/to/some/project/lib -lfoo

Grundsätzlich -L geht dem Verzeichnis und -l steht vor dem Namen der Bibliothek ohne 'lib' und '.so'.

Hinweis: Immer wenn ich externe Abhängigkeiten in meine xcode-Projekte einfüge, setze ich auch "Build-Einstellungen" -> "Suchpfade" -> "Immer Benutzerpfade durchsuchen" auf "Ja", falls eines der Abhängigkeiten Header mit enthält spitze Klammern wie #include <header.h>.

+0

EDIT: Ok Ich habe die Linker Flags von einem opencv Tutorial hinzugefügt und jetzt bekomme ich nur die Fehler mit den schnellen Methoden. Ich habe überprüft, ob "Immer Benutzerpfade durchsuchen" ob Ja ist. Die Fast-Methoden und der Header sind in meinem Projektordner enthalten. Ich werde die .h Datei in meine Frage einfügen, da ist wahrscheinlich etw. falsch? –

+0

In den Kompilierquellen gibt es die .c-Dateien von Fast. –

+0

Vergiss ich, wo der Fehler war! –

Verwandte Themen