2012-04-08 19 views
1

makeファイルとC++を使用していくつかのファイルをリンクして、makeを実行するときに次のエラーが表示されます。私はまだOpenCVのバインディングを必要としませんが、後でOpenCVのにコーディングされます、注意してください(次のように。ファイルを作成する問題が発生するアーキテクチャx86_64の未定義シンボル

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 [email protected] 
all: rungist 

clean: 
rm -rf $(OBJS) rungist 

メソッドヘッダがgist.h

に位置している私のメイクファイルがある

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 

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) { 
に定義されています

そして最後にcompute_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; 
} 

任意の助けをいただければ幸いです。これが十分な情報であることを願っています。追加する必要があるかどうかを教えてください。

+0

'color_gist_scaletab'は' gist.cpp'で定義されていますが、次に表示されるのは 'color_gist_scaletab'ではなく' color_gist'です。 – geekosaur

+0

申し訳ありません!私はそれを編集した。 color_gist_scaletabとcolor_gistは両方ともgist.cppにあります。 – user1035839

答えて

0

私はcolor_gist_scaletabがあなたのヘッダファイルでextern "C"として宣言する必要があることを疑う:

extern "C" { 
    float *color_gist_scaletab(color_image_t *src, int nblocks, int n_scale, const int *n_orientations); 
} 
+0

を追加しました。 ''extern" C "{ float * color_gist_scaletab(color_image_t * src、int nblocks、int n_scale、const int * n_orientations_); } ' しかしエラーました:アーキテクチャx86_64版のため 未定義のシンボル: "_color_gist_scaletab"、から参照:compute_gist.o "_color_image_delete" に _main、から参照:compute_gist.o "_color_image_new" で _mainを、参照先から:compute_gist.o LDにおける load_ppm(チャーCONST *):記号(S)アーキテクチャx86_64の collect2は見つかりませんが:*** [rungist]エラー1 – user1035839

0

あなたのリンクコマンドラインが正しくありません。 this answerを参照してください。

しかし、これはあなたがここで見ている問題ではない可能性があります。

次のコマンドは何を印刷しますか?

file gist.o 
nm gist.o | grep color_gist_scaletab 

また、thisとよく似た質問を参照してください。しかし、color_gist_scaletabはであり、gist.cppではありません。 gist.cからgist.cppに改名しただけではありませんか? は、です。

+0

ファイル要旨:LDは1つの終了ステータス メークを返さ。 oプリント gist.o:Mach-O 64ビットオブジェクトx86_64 および nm gist.o | grep color_gist_scaletabは nm:no name listを表示します – user1035839

+0

Russion。いいえ、私はファイルの名前を変更しませんでした。私は2つの異なるソースからGistライブラリをダウンロードし、それを私のプロジェクトに含めることを試みています – user1035839

関連する問題