【问题标题】:Undefined reference to function error对函数错误的未定义引用
【发布时间】:2015-10-13 05:51:42
【问题描述】:

我收到了一个.h file,可用作 c++ 程序的一部分。我尝试了所有方法来链接它,但发生了未定义的引用错误。我在 ubuntu 中使用 NetBeans。

.h file 包含我正在尝试使用的功能。然而编译器却找不到函数。

这是fwlib32.h 文件的sn-p,因为它太大而无法插入整个文件:

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)

我查看了其他类似的问题,并尝试在项目属性选项中添加库文件,或者只是在 g++ 语句中创建一个-lfwlib32 选项。它们都没有引起任何变化。该程序仍然无法构建。谁能帮帮我?

【问题讨论】:

  • 您实际上并没有与库链接,否则您会在显示的链接器命令行最后看到-lfwlib32
  • 对,您正在使用在 h 文件中声明的函数,但没有链接库,因此链接器不知道从哪里获得实际实现。您需要链接实现这些功能的库。
  • fwlib32 库是使用 g++ 编译器创建的吗?对于您的程序编译,您使用的是 g++。因此,名称修改(由 c++ 编译器完成)可能是未定义引用问题的原因(如果 fwlib32 库是使用 gcc 而不是 g++ 创建的)。 extern "C" { #include "fwlib32.h" } 方法可以用来避免这个问题。
  • @JoachimPileborg 当我使用 -lfwlib32 时出现的错误是“/usr/bin/ld: cannot find -lfwlib32”
  • @cm161 是该语句的确切语法吗?当我将我的 include 语句更改为您所指示的 extern "C" 语句时,IDE 显示错误

标签: c++ linux ubuntu netbeans


【解决方案1】:

原来 libfwlib32.so 文件适用于 32 位系统,而我的是 64 位系统。我会尝试在 32 位系统兼容性下运行它

【讨论】:

    猜你喜欢
    • 2017-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-08
    • 1970-01-01
    • 2017-07-10
    • 2013-08-20
    相关资源
    最近更新 更多