当前位置: 首页 > 知识库问答 >
问题:

未定义的引用:怎么了?

施晗日
2023-03-14

null

null

null

gcc -DWall -o bin/pingsrv -DUNIX -I. -g -DUNIX -D_THREAD_SAFE -D_LARGEFILE64_SOURCE -I/home/vgi/git/msi-tools/ping/server/target/msi/include/yaml-cpp -I/home/vgi/git/msi-tools/ping/server/target/msi/include/apr-1 -I/home/vgi/git/msi-tools/ping/server/target/msi/include/activemq-cpp-3.9.4 -I/home/vgi/git/msi-tools/ping/server/target/msi/include /tmp/MsiServices.o ./pingsrv.c -L/home/vgi/git/msi-tools/ping/server/target/msi/lib -lmsi -lactivemq-cpp -llog4cxx -latmi -lapr-1 -laprutil-1 -lexpat -lstdc++ -lyaml-cpp

null

/home/vgi/git/msi-tools/ping/server/target/msi/lib/libatmi.so: undefined reference to `Msi_tpreturn'
/home/vgi/git/msi-tools/ping/server/target/msi/lib/libatmi.so: undefined reference to `Msi_tpcall'
/home/vgi/git/msi-tools/ping/server/target/msi/lib/libmsi.so: undefined reference to `msi::service::optarg'
/home/vgi/git/msi-tools/ping/server/target/msi/lib/libatmi.so: undefined reference to `Msi_userlog'

库atmi是用C编写的,能够通过使用包装器调用一些C++实例方法:

...
typedef struct MsiScheduler MsiScheduler ;
extern void Msi_tpreturn(MsiScheduler *,int, long , char *, long, long);
extern void Msi_userlog(MsiScheduler *,char*) ;
extern int Msi_tpcall(MsiScheduler *,char *svc, char *idata, long ilen, char **odata, long *olen, long flags) ;
...
extern void tpreturn(int rval, long rcode, char * data, long len, long flags)
{
    assert(vg_Consumer != NULL) ;
    Msi_tpreturn(vg_Consumer,rval,rcode,data,len,flags) ;

}

此库调用的包装在另一个名为MSI的库中定义。包装在C++源文件中定义(msischeduler.cpp:

void Msi_tpreturn(MsiScheduler * c,int ret,long code,char *data,long len,long flags)
{
    TypedBuffer* buffer = NULL ;

    if (data != NULL)
    {
       buffer = TypedBuffer::createBuffer(getType(data),data,len) ; 
    }
    MsiReply * reply = MsiReply::createReply(ret,code,buffer) ;

    c->tpreturn(reply) ;

    if (data != NULL)
    {
       freebuf(data) ;
    }
    delete reply ;
}
int Msi_tpcall(MsiScheduler * c,char *svc, char *idata, long ilen, char **odata, long *olen, long flags)
{
     ...
}
void Msi_userlog(MsiScheduler *c ,char* str)
{
    c->userlog(str) ;
}

头文件(msischeduler.h)包含以下片段:

#ifdef __cplusplus
extern "C" {
#endif

#if defined(__STDC__) || defined(__cplusplus)
extern void Msi_tpreturn(MsiScheduler *,int, long , char *, long, long);
extern void Msi_userlog(MsiScheduler *,char*) ;
extern int Msi_tpcall(MsiScheduler *,char *svc, char *idata, long ilen, char **odata, long *olen, long flags) ;
#else
extern void Msi_tpreturn();
extern void Msi_userlog() ;
extern int Msi_tpcall() ;
#endif

#ifdef __cplusplus
}
#endif

null

g++ -g -fPIC -Wall -I/home/vgi/git/msi/msi-service/target/ext/include/apr-1 -I/home/vgi/git/msi/msi-service/target/ext/include/activemq-cpp-3.9.4 -I/home/vgi/git/msi/msi-service/target/ext/include/yaml-cpp -I/home/vgi/git/msi/msi-service/target/ext/include -I/home/vgi/git/msi/msi-service/target/ext/include -I../lib/inc -I./ -o MsiScheduler.o -c MsiScheduler.cpp
...
g++ -shared MsiUtil.o MsiConfig.o MsiInstrumentation.o MsiMetric.o MsiService.o MsiExceptions.o MsiCharsetConverter.o MsiTypes.o MsiMessage.o MsiMessageUtil.o MsiScheduler.o MsiServer.o -o libmsi.so
...
gcc -g -fPIC -Wall -I/home/vgi/git/msi/msi-service/target/ext/include/apr-1 -I/home/vgi/git/msi/msi-service/target/ext/include/activemq-cpp-3.9.4 -I/home/vgi/git/msi/msi-service/target/ext/include/yaml-cpp -I/home/vgi/git/msi/msi-service/target/ext/include -I/home/vgi/git/msi/msi-service/target/ext/include -I../lib/inc -I./ -o atmi.o -c atmi.c
gcc -shared atmi.o memmngt.o -o libatmi.so

仅供参考,所有东西都在AIX OS上编译和链接良好(使用xlc,xlc命令)。

我还尝试更改Librariries的链接命令顺序,但没有成功。

我想有一些特定于linux/gcc的东西,但是我还没有找到。

共有2个答案

淳于俊迈
2023-03-14

在编译pingsrv.c时,您会尝试将msi与-l链接起来。你有没有把libmsi.so放在库路径中以便-l能找到它?

东方谦
2023-03-14
libmsi.so:0000000000034f20 T _Z10Msi_tpcallPN3msi7service12MsiSchedulerEPcS3_lPS3_Pll
libmsi.so:0000000000035138 T _Z11Msi_userlogPN3msi7service12MsiSchedulerEPc
libmsi.so:0000000000034e55 T _Z12Msi_tpreturnPN3msi7service12MsiSchedulerEilPcll
libatmi.so: U Msi_tpcall
libatmi.so: U Msi_tpreturn
libatmi.so: U Msi_userlog

输出中, c++++mangling,这有助于将重载函数分开。<="">

这意味着 在编译msischeduler.cpp时没有应用于函数定义。确保它包括msischeduler.h,并且头的这一部分没有被任何 跳过。如果这不是问题所在,请仔细检查msischeduler.h声明和msischeduler.cpp定义中的函数参数类型是否完全相同,尽管它们看起来是相同的。

 类似资料:
  • 问题内容: 我正在尝试在操作系统上设置libusb API。我在libusb.org上下载了libusb api。我遵循了标准的安装过程: 然后,我启动了Eclipse C / C ++,并从Internet上的教程中复制了一些代码。但是当尝试构建它时,我得到以下输出: 我在/ lib中有libusb.so,在/ usr / local / include中也有usb.h,在/ usr / loc

  • b-tree索引,如果不建立索引的情况下,oracle就自动给每一列都加一个B 树索引; normal:普通索引 unique:唯一索引 bitmap:位图索引,位图索引特定于只有几个枚举值的情况,比如性别字段; 基于函数的索引

  • 我正在尝试使用AassetManager从android apk访问资产。然而,尽管我已经包含了asset_manager.h和asset_manager_jni.h,但我仍然得到了“对aassetmanager_fromjava的未定义引用”。其他来自asset_manager.h的函数,如AAssetManager_openDir(mgr,"“)等也不能被引用。 以下是完整的代码 这段代码在一

  • 错误:未定义对'pthread_cancel'的引用

  • 我试图以编程方式创建一个饼图,希望把它变成一个React组件来重用。基本上,我需要一个饼图,是可点击的,每个切片扩展成一个整体饼当点击。我试图按照这个教程来制作饼图,在底部,我有一个JS的一部分,我试图测试出来。我最终得到了以下是错误消息的截图。 我的理解是,这不是jQuery,只是一个普通的JS。我不确定这是不是真的。我通过CDN导入jQuery,但仍然得到相同的错误。我读了这篇文章,我认为只是

  • 问题内容: 我正在使用Linux,并且具有以下文件: 该函数在中声明和定义。我需要在中使用该函数,因此我将该函数声明为 在。 但是,在编译过程中,我得到了错误 怎么了? 谢谢。 预计到达时间:多亏了我收到的答案,我现在有了以下内容: 在fileA.h中,我有 在fileA.c中,我有 在fileB.h中,我有 在fileB.cpp中,我有 但是,我现在有错误 问题答案: 如果您确实是使用C而不是C