2012-04-08 56 views
1

我正在使用make文件和C++獲取幾個文件以鏈接在一起,並且在運行make時遇到以下錯誤。創建文件鏈接問題體系結構x86_64的未定義符號

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 

我的makefile文件如下(請注意,我不需要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 [email protected] 
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) { 

最後的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',而不是'color_gist_scaletab'。 – geekosaur 2012-04-08 06:02:16

+0

對不起!我編輯它。 color_gist_scaletab和color_gist都在gist.cpp中。 – user1035839 2012-04-08 06:05:23

回答

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」{* 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,從引用: _main在compute_gist.o 「_color_image_new」 ,引用來自: compute_gist.o中的load_ppm(char const *) ld:架構x86_64找不到ld:symbol(s) collect2:ld返回1退出狀態 make:*** [rungist]錯誤1 – user1035839 2012-04-08 16:40:07

0

您的鏈接命令行不正確。見this answer

但是,這可能不是你在這裏看到的問題。

下列命令會打印什麼?

file gist.o 
nm gist.o | grep color_gist_scaletab 

我也看到this非常類似的問題。但在那裏,color_gist_scaletab來自gist.c,而不是gist.cpp。你不只是將gist.c重命名爲gist.cpp,是嗎?不要做

+0

文件要點。 o打印 gist.o:Mach-O 64位對象x86_64 和 nm gist.o | grep color_gist_scaletab打印 nm:沒有名字列表 – user1035839 2012-04-08 16:33:20

+0

Russion。不,我沒有重命名這些文件。我從兩個不同的來源下載了Gist庫,並試圖將其納入我的項目 – user1035839 2012-04-10 01:28:28

相關問題