简体   繁体   English

XCode构建失败“架构x86_64的未定义符号”

[英]XCode Build Failed “undefined Symbols for architecture x86_64”

SOLVED: FOR OPENCV SOLUTION LOOK UP ANSWER FROM Jvinniec FOR THE FAST.H SOLUTION LOOK UP EDIT 已解决:有关OpenCV解决方案的查找,请参考Jvinniec的FAST.H解决方案查找编辑

I looked up several similar Questions and did not find a Solution for my Code yet. 我查找了几个类似的问题,但尚未找到我的代码的解决方案。 The error I get looks like this: 我得到的错误如下所示:

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)

The Architecture I am using in XCode is Universal. 我在XCode中使用的体系结构是通用的。 I builded and added the search paths for openCV and the fast9 Methods are in the fast.h header. 我建立并添加了openCV的搜索路径,fast9方法位于fast.h标头中。 I tried to delete the derived data of the Project but nothing helped. 我试图删除该项目的派生数据,但没有任何帮助。 Here my Code of the main.cpp: 这是我的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: For OpenCV helped to add the Linker Flags from this Tutorial: OpenCV The Methods from fast are in a .c File which is in my Project Folder. 编辑:对于OpenCV,它有助于从本教程中添加链接器标志: OpenCV快速方法来自于我项目文件夹中的.c文件。 Also the .h file is there. .h文件也在那里。 I just post the .h File here because .c File is far too long because its mechanically generated. 我只是在此发布.h文件,因为.c文件太长了,因为它是机械生成的。

SOLUTION: It was my Mistake with the fast methods. 解决方案:快速方法是我的错误。 I totally forgot to add Extern "C" {} in the main.cpp at the #include "fast.h" because it calls C files and not C++ Files. 我完全忘记在main.cpp中的#include "fast.h"处添加Extern "C" {} ,因为它调用C文件而不是C ++文件。

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

It sounds as though you've only add the header search paths for these dependencies under your projects "Build Settings" -> "Search Paths" -> "User Header Search Paths" field. 听起来好像您只在项目的“ Build Settings”->“ Search Paths”->“ User Header Search Paths”字段下为这些依赖项添加了头搜索路径。 This will enable xcode to know that these classes exist while you are developing, but wont enable your project to build. 这将使xcode能够知道这些类在您开发时就存在,但不会使您的项目得以构建。 You should also make sure that your project knows where to find the libraries where the openCV and fast9 symbols you're using are defined (ie where the .so files are for these two dependencies). 您还应确保您的项目知道在哪里可以找到定义所使用的openCV和fast9符号的库(即, .so文件用于这两个依赖项的位置)。 You can do this by adding the appropriate linker flags under "Build Settings" -> "Linking" -> "Other Linker Flags". 您可以通过在“构建设置”->“链接”->“其他链接器标志”下添加适当的链接器标志来完成此操作。 ALSO make sure that these fields are set for the TARGET you are trying to compile, not just the PROJECT. 还请确保为您要编译的目标(不仅仅是项目)设置了这些字段。

If you arent sure what the linker flags are, here is a brief example. 如果您不确定链接器的标志是什么,请参考以下示例。 I want to link the following library: 我想链接以下库:

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

I would add the following to the "Other Linker Flags" field: 我将以下内容添加到“其他链接器标志”字段中:

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

Basically -L precedes the directory and -l precedes the name of the library without the 'lib' and '.so'. 基本上, -L在目录之前,而-l在库名称之前,没有'lib'和'.so'。

Note: Whenever I include external dependencies in my xcode projects I also set "Build Settings" -> "Search Paths" -> "Always Search User Paths" to "Yes" just in case any of the dependencies include headers with angle brackets like #include <header.h> . 注意:每当我在xcode项目中包括外部依赖项时,我还将“构建设置”->“搜索路径”->“始终搜索用户路径”设置为“是”,以防万一任何依赖项都包含带有尖括号的标头,例如#include <header.h>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM