Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ boost::signals2链接库时未定义的引用_C++_Gcc_Undefined Reference_Boost Signals2 - Fatal编程技术网

C++ boost::signals2链接库时未定义的引用

C++ boost::signals2链接库时未定义的引用,c++,gcc,undefined-reference,boost-signals2,C++,Gcc,Undefined Reference,Boost Signals2,我想将两个库链接到我的程序。第一个定义了一个对象(ProducerObject类),它发出一个信号。第二个库定义了两个类:一个包含多个ProducerObject实例的从属类和一个可以通过从属类订阅ProducerObject信号的主类 第一个库的代码是: ProducerObject.hpp: \ifndef PRODUCEROBJECT\u水电站_ #定义PRODUCEROBJECT_水电站_ #包括 #包括 #include//不应该是必需的 名称空间testnm{ 类产品对象{ 公众:

我想将两个库链接到我的程序。第一个定义了一个对象(ProducerObject类),它发出一个信号。第二个库定义了两个类:一个包含多个ProducerObject实例的从属类和一个可以通过从属类订阅ProducerObject信号的主类

第一个库的代码是:
ProducerObject.hpp:

\ifndef PRODUCEROBJECT\u水电站_
#定义PRODUCEROBJECT_水电站_
#包括
#包括
#include//不应该是必需的
名称空间testnm{
类产品对象{
公众:
类型定义增压::信号2::信号广播信号;
类型定义广播信号:时隙类型广播时隙;
私人:
广播信号;
公众:
ProducerObject();
虚拟~ProducerObject();
boost::signals2::连接连接(const广播\u槽\u槽和槽);
boost::signals2::connect2(const boost::function&slot);//不需要
void sendMessage(boost::shared_ptr msg);
};
}/*名称空间testnm*/
#endif/*生产项目水电站*/
producerbject.cpp:

#包括“ProducerObject.hpp”
名称空间testnm{
ProducerObject::ProducerObject(){
}
ProducerObject::~ProducerObject(){
}
boost::signals2::connection ProducerObject::connect(const broadcast\u slot\u t和slot){
返回信号连接(插槽);
}
//不需要
boost::signals2::connection ProducerObject::connect2(const boost::函数和插槽){
返回连接(插槽);
}
void ProducerObject::sendMessage(boost::shared_ptr msg){
sig(msg);
}
}/*名称空间testnm*/
在调试目录中编译此文件,该目录与使用以下命令编写的代码处于同一级别:

g++-O0-g3-Wall-c-fmessage length=0-fPIC-MMD-MP-MF“producerbject.d”-MT“producerbject.d”-o“producerbject.o”“../producerbject.cpp”

g++-shared-o“libproducerbject.so”。/producerbject.o

第二个库的代码是:
MasterAPI.hpp:

\ifndef MASTERAPI\u水电站_
#定义MASTERAPI_水电站_
#包括“SlaveAPI.hpp”
#包括
#包括
#包括
#包括
名称空间testnm{
类MasterAPI{
私人:
int-id_2;;
公众:
MasterAPI(const int&id);
虚拟~MasterAPI();
void subscribeToProducer(boost::shared_ptr slave,const unsigned long int&producerid);
虚拟void-onMessage(boost::shared_ptr-msg);
};
}/*名称空间testnm*/
#endif/*MASTERAPI\u水电站*/
SlaveAPI.hpp:

\ifndef SLAVEAPI\u水电站_
#定义SLAVEAPI_水电站_
#包括
#包括
名称空间testnm{
类MasterAPI;//转发声明
斯拉维亚皮类{
公众:
SlaveAPI();
虚拟~SlaveAPI();
虚拟boost::shared_ptr getProducer(const unsigned long int&producerid)const=0;
void sendedicatedmessage(const boost::shared_ptr master,boost::shared_ptr msg);
};
}/*名称空间testnm*/
#包括“MasterAPI.hpp”//MasterAPI类的完整声明
//(用于实现方法“SendIficatedMessage”)
#endif/*SLAVEAPI_水电站*/
SlaveBase.hpp:

\ifndef SLAVEBASE\u水电站_
#定义SLAVEBASE_水电站_
#包括“SlaveAPI.hpp”
#包括
#包括
#包括
名称空间testnm{
类SlaveBase:public SlaveAPI{
私人:
std::无序的地图生产者;
公众:
SlaveBase();
虚拟~SlaveBase();
虚拟boost::shared_ptr getProducer(const unsigned long int&producerid)const;
};
}/*名称空间testnm*/
#endif/*SLAVEBASE\u水电站*/
MasterAPI.cpp:

#包括“MasterAPI.hpp”
名称空间testnm{
MasterAPI::MasterAPI(常量int&id):id\uID{
}
MasterAPI::~MasterAPI(){
}
void MasterAPI::subscribeToProducer(boost::shared_ptr slave,const unsigned long int&producerid){
boost::shared_ptr producer=slave->getProducer(producerid);
//producer->connect((ProducerObject::broadcast_slot_t)(boost::bind(&MasterAPI::onMessage,this,_1));//不应该被评论
producer->connect2(boost::bind(&MasterAPI::onMessage,this,_1));//不需要
}
void MasterAPI::onMessage(boost::shared_ptr msg){
std::cout subscribeToProducer(从机,1);
cout sendMessage(msg);
cout sendMessage(msg);
返回0;
}
编译时使用:

g++-I”/home/chris/workspace/ProducerObject“-I”/home/chris/workspace/ObjectAPI“-O0-g3-Wall-c-fmessage length=0-std=c++0x-MMD-MP-MF“ObjectTest.d”-MT“ObjectTest.d”-o“ObjectTest.o”“../ObjectTest.cpp”

g++-L”/home/chris/workspace/ProducerObject/Debug“-L”/home/chris/workspace/ObjectAPI/Debug“-o“ObjectTest”。/ObjectTest.o-lObjectAPI-lProducerObject

此程序产生以下输出,这正是所需的:

-->向master1发送专用消息:
MasterAPI中接收到的消息(1):值=11

-->从procuder1发送广播消息:
MasterAPI中接收到的消息(1):值=22
MasterAPI中接收到的消息(2):值=22

-->从procuder2发送广播消息:
MasterAPI中接收到的消息(1):值=33

为了产生这个输出,我必须依赖辅助方法connect2,它以boost::function作为参数。我希望避免这种情况,因为插槽的签名应该已经包含在*broadcast\u slot\t*类型中。因此,我希望实现的代码版本不会包含connect2方法。但是如果我从conn切换ect2要在方法MasterAPI::subscribeToProducer的实现中连接(只需将注释更改为test),最后一个编译阶段(所有内容都链接在一起)会产生以下错误:

> /home/chris/workspace/ObjectAPI/Debug/libObjectAPI.so: undefined reference to `testnm::ProducerObject::connect(boost::signals2::slot<void (boost::shared_ptr<int>), boost::function<void (boost::shared_ptr<int>)> > const&)'  
> collect2: error: ld returned 1 exit status  
> make: *** [ObjectTest] Error 1
/home/chris/workspace/ObjectAPI/Debug/libObjectAPI.so:testnm::ProducerObject::connect(boost::signals2::slot const&)的未定义引用
>科尔