Сделать файл Linking issue Неопределенные символы для архитектуры x86_64

Я работаю над тем, чтобы связать несколько файлов вместе, используя мой файл make и С++, и при запуске make получаю следующую ошибку.

g++ -bind_at_load `pkg-config --cflags opencv`   -c -o compute_gist.o compute_gist.cpp
g++ -bind_at_load `pkg-config --cflags opencv`   -c -o gist.o gist.cpp
g++ -bind_at_load `pkg-config --cflags opencv`   -c -o standalone_image.o standalone_image.cpp
g++ -bind_at_load `pkg-config --cflags opencv`   -c -o IplImageConverter.o IplImageConverter.cpp
g++ -bind_at_load `pkg-config --cflags opencv`   -c -o GistCalculator.o GistCalculator.cpp
g++ -bind_at_load `pkg-config --cflags opencv` `pkg-config --libs opencv` compute_gist.o gist.o standalone_image.o IplImageConverter.o GistCalculator.o -o rungist
Undefined symbols for architecture x86_64:
    "color_gist_scaletab(color_image_t*, int, int, int const*)", referenced from:
    _main in compute_gist.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status
make: *** [rungist] Error 1

Мой make-файл выглядит следующим образом (обратите внимание, мне пока не нужны привязки opencv, но позже я буду кодировать в opencv.

CXX = g++
CXXFLAGS = -bind_at_load `pkg-config --cflags opencv`
LFLAGS = `pkg-config --libs opencv`

SRC = \
compute_gist.cpp \
gist.cpp \
standalone_image.cpp \
IplImageConverter.cpp \
GistCalculator.cpp

OBJS = $(SRC:.cpp=.o)

rungist: $(OBJS)
$(CXX) $(CXXFLAGS) $(LFLAGS) $(OBJS) -o $@
all: rungist

clean:
rm -rf $(OBJS) rungist

Заголовок метода находится в gist.h

float *color_gist_scaletab(color_image_t *src, int nblocks, int n_scale, const int *n_orientations);

И метод определен в gist.cpp

float *color_gist_scaletab(color_image_t *src, int w, int n_scale, const int *n_orientation) {

И, наконец, calculate_gist.cpp (основной файл)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


#include "gist.h"


static color_image_t *load_ppm(const char *fname) {
  FILE *f=fopen(fname,"r");
  if(!f) {
    perror("could not open infile");
    exit(1);
  }
  int width,height,maxval;
  if(fscanf(f,"P6 %d %d %d",&width,&height,&maxval)!=3 || maxval!=255) {
  fprintf(stderr,"Error: input not a raw PPM with maxval 255\n");
  exit(1);    
  }
  fgetc(f); /* eat the newline */
  color_image_t *im=color_image_new(width,height);

  int i;
  for(i=0;i<width*height;i++) {
    im->c1[i]=fgetc(f);
    im->c2[i]=fgetc(f);
    im->c3[i]=fgetc(f);    
  }

  fclose(f);
  return im;
}


static void usage(void) {
  fprintf(stderr,"compute_gist options... [infilename]\n"
      "infile is a PPM raw file\n"
      "options:\n"
      "[-nblocks nb] use a grid of nb*nb cells (default 4)\n"
      "[-orientationsPerScale o_1,..,o_n] use n scales and compute o_i orientations for scale i\n"
      );

  exit(1);
}




int main(int argc,char **args) {

const char *infilename="/dev/stdin";
int nblocks=4;
int n_scale=3;
int orientations_per_scale[50]={8,8,4};


while(*++args) {
  const char *a=*args;

  if(!strcmp(a,"-h")) usage();
  else if(!strcmp(a,"-nblocks")) {
    if(!sscanf(*++args,"%d",&nblocks)) {
      fprintf(stderr,"could not parse %s argument",a); 
      usage();
    }
  } else if(!strcmp(a,"-orientationsPerScale")) {
    char *c;
    n_scale=0;
    for(c=strtok(*++args,",");c;c=strtok(NULL,",")) {
      if(!sscanf(c,"%d",&orientations_per_scale[n_scale++])) {
        fprintf(stderr,"could not parse %s argument",a); 
        usage();         
      }
    }
  } else {
    infilename=a;
  }
}

color_image_t *im=load_ppm(infilename);

//Here's the method call -> :(
float *desc=color_gist_scaletab(im,nblocks,n_scale,orientations_per_scale);

int i;

int descsize=0;
//compute descriptor size
for(i=0;i<n_scale;i++) 
  descsize+=nblocks*nblocks*orientations_per_scale[i];

  descsize*=3; // color

  //print descriptor
  for(i=0;i<descsize;i++) 
    printf("%.4f ",desc[i]);

    printf("\n");

    free(desc);

    color_image_delete(im);

    return 0; 
}

Любая помощь будет принята с благодарностью. Я надеюсь, что это достаточно информации. Дайте мне знать, если мне нужно добавить больше.


person user1035839    schedule 08.04.2012    source источник
comment
Вы говорите, что color_gist_scaletab определено в gist.cpp, но то, что вы затем показываете, называется color_gist, а не color_gist_scaletab.   -  person geekosaur    schedule 08.04.2012
comment
Извини за это! Я отредактировал его. color_gist_scaletab и color_gist находятся в gist.cpp.   -  person user1035839    schedule 08.04.2012


Ответы (2)


Я подозреваю, что color_gist_scaletab должен быть объявлен как extern "C" в вашем заголовочном файле:

extern "C" {
  float *color_gist_scaletab(color_image_t *src, int nblocks, int n_scale, const int *n_orientations);
}
person zvrba    schedule 08.04.2012
comment
Я добавил extern "C" { float* color_gist_scaletab(color_image_t *src, int nblocks, int n_scale, const int *n_orientations_); } , но получил ошибку: Неопределенные символы для архитектуры x86_64: _color_gist_scaletab, на которую ссылается: _main в calculate_gist.o _color_image_delete, на который ссылается: _main в calculate_gist.o _color_image_new, на который ссылается: load_ppm(char const*) в calculate_gist.o ld : символ(ы) не найден(ы) для архитектуры x86_64 collect2: ld вернул 1 статус выхода make: *** [rungist] Ошибка 1 - person user1035839; 08.04.2012

Командная строка вашей ссылки неверна. См. этот ответ.

Однако, скорее всего, это не та проблема, которую вы видите здесь.

Что выводят следующие команды?

file gist.o
nm gist.o | grep color_gist_scaletab

Я также вижу этот очень похожий вопрос. Но там color_gist_scaletab происходит от gist.c, а не gist.cpp. Вы же не просто переименовали gist.c в gist.cpp, не так ли? Не делайте этого.

person Employed Russian    schedule 08.04.2012
comment
файл gist.o выводит gist.o: 64-битный объект Mach-O x86_64 и nm gist.o | grep color_gist_scaletab печатает nm: нет списка имен - person user1035839; 08.04.2012
comment
Россия. Нет, я не переименовывал файлы. Я загрузил библиотеку Gist из двух разных источников и пытаюсь включить ее в свой проект. - person user1035839; 10.04.2012