在ubuntu调用别的部门编写的so文件。连接时提示
In function `CExpoLibWrapper::CExpoLibWrapper(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)": ExpoLibWrapper.cpp:(.text+0xff): undefined reference to `MessageBus::IAppServer::IAppServer(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)"
编译命令为
g++ -o tester.out ExpoLibWrapperMain.cpp ExpoLibWrapper.cpp -L. -lExpo
使用nm命令产看函数的导出情况显示已经导出了(第二条和第五条)
nm -CD libExpo.so| grep "MessageBus::IAppServer::IAppServer" 00000000001aef94 T MessageBus::IAppServer::IAppServer(std::tr1::shared_ptr<Expo::IClient>) 00000000001afc7e T MessageBus::IAppServer::IAppServer(std::string const&) 00000000001afada T MessageBus::IAppServer::IAppServer(unsigned short, unsigned short, unsigned short) 00000000001aef5a T MessageBus::IAppServer::IAppServer(std::tr1::shared_ptr<Expo::IClient>) 00000000001afd40 T MessageBus::IAppServer::IAppServer(std::string const&) 00000000001afbac T MessageBus::IAppServer::IAppServer(unsigned short, unsigned short, unsigned short)
本人的部分代码如下:
class CExpoLibWrapper: public MessageBus::IAppServer { private: CExpoLibWrapper(const CExpoLibWrapper&); CExpoLibWrapper& operator= (const CExpoLibWrapper&); ServerState m_serverstate; public: CExpoLibWrapper(const std::string& url); CExpoLibWrapper(unsigned short classID, unsigned short Count1, unsigned short Count2); virtual ~CExpoLibWrapper(); };
//CExpoLibWrapper g_wrapper(1,2,2); CExpoLibWrapper g_wrapper("Cfg.xml"); void main() {}
使用CExpoLibWrapper g_wrapper(1,2,2); 不会导致链接错误。
使用CExpoLibWrapper g_wrapper(“Cfg.xml”);则会导致上述错误。
看上去像是第一种基类的构造函数没有实现。可是本人无从查看其他部门的代码。问一下有人遇到过相似情况吗?或其他原因会导致上述问题。谢谢了!
解决方案
10
编译器能否同一个版本?
最好使用 .a 静态库编译
最好使用 .a 静态库编译
10
http://bbs.csdn.net/topics/392004872
应该和这个是同一具问题,lib和程序的字符集不一致
应该和这个是同一具问题,lib和程序的字符集不一致
8
直接调用IAppServer(std::string const&)看看咯,不行那大致就是找不到定义了。那应该可以跟其他部门反映的吧
12
最好拿源码一起编译,最差也要保证编译器版本、引用的标准库以及编译选项一致,例如
-std=c++11
这样的
-std=c++11
这样的