2015-10-13 6 views
2

Я получил .h file, который будет использоваться как часть программы на C++. Я пробовал каждый метод, чтобы связать его, но неопределенная ошибка ссылки происходит. Я использую NetBeans в ubuntu.Неопределенная ссылка на функциональную ошибку

.h file содержит функции, которые я пытаюсь использовать. И все же компилятор не может найти функцию.

Вот фрагмент файла fwlib32.h, так как он слишком большой, чтобы вставить весь файл:

FWLIBAPI short WINAPI cnc_allclibhndl3(const char *, unsigned short, long, unsigned short *); 
FWLIBAPI short WINAPI cnc_upstart3(unsigned short, short, long, long) ; 
FWLIBAPI short WINAPI cnc_upstart3_f(unsigned short, short, char *, char *) ; 
FWLIBAPI short WINAPI cnc_statinfo(unsigned short, ODBST *) ; 
FWLIBAPI short WINAPI cnc_upload3(unsigned short, long *, char *) ; 
FWLIBAPI short WINAPI cnc_upend3(unsigned short) ; 
FWLIBAPI short WINAPI cnc_freelibhndl(unsigned short) ; 

Вот мой файл программы:

#include "fwlib32.h" 
#include<pthread.h> 
#include<stdio.h> 
#include<string.h> 
#define BUFSIZE 1280 
static unsigned short H; 
struct conn_data 
{ 
    char ip[100]; 
    short prt; 
    long tmo; 
    long pnum; 
}; 
void conn(char *ipadd, short port, long tmout) 
{ 
    unsigned short h; 
    short ret; 
    ODBST buf; 
    ret = cnc_allclibhndl3(ipadd, port, tmout, &h) ; 
    if (!ret) { 
     cnc_statinfo(h, &buf) ; 
     H=h; 
    } 
    else 
     printf("ERROR!(%d)\n", ret) ; 
} 
short upld(long prgnum) 
{ 
    unsigned short h=H; 
    char buf[BUFSIZE+1] ; 
    short ret ; 
    long len; 
    ret = cnc_upstart3(h, 0, prgnum, prgnum) ; 
    if (ret) return (ret) ; 
    do { 
     len = BUFSIZE ; 
     ret = cnc_upload3(h, &len, buf) ; 
     if (ret == EW_BUFFER) { 
      continue ; 
     } 
     if (ret == EW_OK) { 
      buf[len] = '\0' ; 
      printf("%s", buf) ; 
     } 
     if (buf[len-1] == '%') { 
      break ; 
     } 
    } while (ret == EW_OK) ; 
    ret = cnc_upend3(h) ; 
    return (ret) ; 
    pthread_exit(&ret); 
} 
void* start_thread(void * dat) 
{ 
    struct conn_data *data; 
    data = (struct conn_data *)dat; 
    conn(data->ip, data->prt, data->tmo); 
    upld(data->pnum); 
} 
int main() 
{ 
    struct conn_data data; 
    char ip[100]; 
    short prt; 
    long tmo,pnum; 
    pthread_t thread1; 
    int *ptr; 
    printf("\nEnter the IP address\n"); 
    scanf("%s",ip); 
    strcpy(data.ip,ip); 
    printf("\nEnter the port number\n"); 
    scanf("%hd",&prt); 
    data.prt=prt; 
    printf("\nEnter the timeout period in seconds\n"); 
    scanf("%ld",&tmo); 
    data.tmo=tmo; 
    printf("Enter the program number\n"); 
    scanf("%ld",&pnum); 
    data.pnum=pnum; 
    pthread_create(&thread1, NULL, start_thread, (void*)&data); 
    pthread_join(thread1, (void **) &ptr); 
    cnc_freelibhndl(H) ; 
    return 0; 
} 

и это содержимое окна компилятора в NetBeans:

"/usr/bin/make" -f nbproject/Makefile-Debug.mk QMAKE= SUBPROJECTS= .clean-conf 
make[1]: Entering directory `/home/niketh/NetBeansProjects/AmiT1' 
rm -f -r build/Debug 
rm -f dist/Debug/GNU-Linux-x86/amit1 
make[1]: Leaving directory `/home/niketh/NetBeansProjects/AmiT1' 

CLEAN SUCCESSFUL (total time: 56ms) 
"/usr/bin/make" -f nbproject/Makefile-Debug.mk QMAKE= SUBPROJECTS= .build-conf 
make[1]: Entering directory `/home/niketh/NetBeansProjects/AmiT1' 
"/usr/bin/make" -f nbproject/Makefile-Debug.mk dist/Debug/GNU-Linux-x86/amit1 
make[2]: Entering directory `/home/niketh/NetBeansProjects/AmiT1' 
mkdir -p build/Debug/GNU-Linux-x86 
rm -f build/Debug/GNU-Linux-x86/connect.o.d 
g++ -c -g -MMD -MP -MF build/Debug/GNU-Linux-x86/connect.o.d -o build/Debug/GNU-Linux-x86/connect.o connect.cpp 
mkdir -p dist/Debug/GNU-Linux-x86 
g++  -o dist/Debug/GNU-Linux-x86/amit1 build/Debug/GNU-Linux-x86/connect.o -lpthread 
build/Debug/GNU-Linux-x86/connect.o: In function `conn(char*, short, long)': 
/home/niketh/NetBeansProjects/AmiT1/connect.cpp:22: undefined reference to `cnc_allclibhndl3' 
/home/niketh/NetBeansProjects/AmiT1/connect.cpp:24: undefined reference to `cnc_statinfo' 
build/Debug/GNU-Linux-x86/connect.o: In function `upld(long)': 
/home/niketh/NetBeansProjects/AmiT1/connect.cpp:37: undefined reference to `cnc_upstart3' 
/home/niketh/NetBeansProjects/AmiT1/connect.cpp:41: undefined reference to `cnc_upload3' 
/home/niketh/NetBeansProjects/AmiT1/connect.cpp:53: undefined reference to `cnc_upend3' 
build/Debug/GNU-Linux-x86/connect.o: In function `main': 
/home/niketh/NetBeansProjects/AmiT1/connect.cpp:88: undefined reference to `cnc_freelibhndl' 
collect2: error: ld returned 1 exit status 
make[2]: *** [dist/Debug/GNU-Linux-x86/amit1] Error 1 
make[2]: Leaving directory `/home/niketh/NetBeansProjects/AmiT1' 
make[1]: *** [.build-conf] Error 2 
make[1]: Leaving directory `/home/niketh/NetBeansProjects/AmiT1' 
make: *** [.build-impl] Error 2 

BUILD FAILED (exit value 2, total time: 220ms) 

Я рассмотрел другие подобные вопросы и сделал d, чтобы добавить файл библиотеки в параметр свойств проекта или просто создать параметр -lfwlib32 в инструкции g ++. Ни одно из них не вызвало никаких изменений. Программа все равно не будет построена. Кто-нибудь может мне помочь, пожалуйста!

+1

Вы на самом деле не * связываете * с библиотекой, или вы бы видели '-lfwlib32' last в командной строке компоновщика. –

+0

Правильно, вы используете функции, объявленные в h-файле, но не связываете библиотеку, поэтому линкер не знает, где получить фактическую реализацию. Вам нужно связать с библиотекой, реализующей эти функции. – olegst

+0

Была ли библиотека fwlib32 создана с использованием компилятора g ++? Для вашей компиляции программы вы используете g ++. Таким образом, определение имени (сделанное компиляторами C++) может быть причиной неопределенной ссылочной проблемы (если библиотека fwlib32 была создана с использованием gcc вместо g ++). Для предотвращения этой проблемы можно использовать метод extern "C" {#include "fwlib32.h"}. – cm161

ответ

1

получается, файл libfwlib32.so предназначен для 32-битных систем, а мой - 64-битная система. я попытаюсь запустить его в 32-битной системе compatibilty

Смежные вопросы