类成员函数找不到undefined reference to

魔鬼筋肉人 2013-08-16 11:22:42
定义了一个类,有一个函数时返回一个vector。

------
StaAgent.h
------

using Ssid_t = struct {
std::string ssid;
};

class StaAgent {
public:
vector<Ssid_t> scanSsid();
...
}

在StaAgent.cpp里定义了此函数的实现

------
StaAgent.cpp
------


vector<Ssid_t> StaAgent::scanSsid()
{
...
}


在另一个文件里调用这个

#include "StaAgent.h"
...
void StaDialog::cn_scanSsidBt_clicked()
{
auto _sa = new StaAgent();
auto ssids = _sa->scanSsid();
...
}

链接的时候显示undefined reference to StaAgent::scanSsid()

g++ -Wl,-O1 -Wl,-rpath,/opt/Qt5.1.0/5.1.0/gcc_64 -Wl,-rpath,/opt/Qt5.1.0/5.1.0/gcc_64/lib -o StaTest main.o StaAgent.o StaDialog.o moc_StaDialog.o -L/opt/Qt5.1.0//5.1.0/gcc_64/lib -lQt5Gui -lQt5Widgets -lQt5Core -lGL -lpthread
StaDialog.o: In function `StaDialog::cn_scanSsidBt_clicked()':
StaDialog.cpp:(.text+0x1d2): undefined reference to `StaAgent::scanSsid()'
collect2: error: ld returned 1 exit status



----------------------------------
首先,链接文件里能找到StaAgent.o
然后使用nm -C StaAgent.o
在输出里,找不到StaAgent::scanSsid()这个符号。
...全文
834 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
ri_aje 2013-08-16
  • 打赏
  • 举报
回复
改成这样再试一下。

struct Ssid_t 
{
std::string ssid;
};
mujiok2003 2013-08-16
  • 打赏
  • 举报
回复
在检查一下cpp文件,定义和申明要完全一致(包含类名,名字空间等)
魔鬼筋肉人 2013-08-16
  • 打赏
  • 举报
回复
引用 3 楼 mujiok2003 的回复:
g++ -Wl,-O1 -Wl,-rpath,/opt/Qt5.1.0/5.1.0/gcc_64 -Wl,-rpath,/opt/Qt5.1.0/5.1.0/gcc_64/lib -o StaTest main.o StaAgent.o StaDialog.o moc_StaDialog.o -L/opt/Qt5.1.0//5.1.0/gcc_64/lib -lQt5Gui -lQt5Widgets -lQt5Core -lGL -lpthread
换一下顺序
g++ -Wl,-O1 -Wl,-rpath,/opt/Qt5.1.0/5.1.0/gcc_64 -Wl,-rpath,/opt/Qt5.1.0/5.1.0/gcc_64/lib -o StaTest main.o  StaDialog.o StaAgent.o moc_StaDialog.o -L/opt/Qt5.1.0//5.1.0/gcc_64/lib -lQt5Gui -lQt5Widgets -lQt5Core -lGL -lpthread
你说的这个我也试过,我想问题不在这里。问题在于StaAgent.o文件里并没有生成StaAgent::scanSsid()这个符号。这个是nm -C StaAgent.o的输出: [root@localhost StaTest]# nm -C StaAgent.o U close U __cxa_allocate_exception U __cxa_atexit U __cxa_free_exception U __cxa_throw U __dso_handle 0000000000000000 V DW.ref.__gxx_personality_v0 U _GLOBAL_OFFSET_TABLE_ 0000000000000000 t _GLOBAL__sub_I__ZN8StaAgentC2ERKSs U __gxx_personality_v0 0000000000000000 r .LC0 0000000000000000 r .LC1 00000000000000ad r .LC10 00000000000000c0 r .LC11 00000000000000d3 r .LC12 00000000000000eb r .LC13 00000000000000fa r .LC14 0000000000000109 r .LC15 000000000000011d r .LC16 0000000000000136 r .LC17 0000000000000145 r .LC18 0000000000000154 r .LC19 000000000000001d r .LC2 000000000000002d r .LC3 000000000000003d r .LC4 0000000000000052 r .LC5 000000000000006b r .LC6 0000000000000078 r .LC7 0000000000000085 r .LC8 0000000000000097 r .LC9 U perror U recv U send U strncpy U _Unwind_Resume 00000000000000a0 T StaAgent::setCountry(std::string const&) 0000000000000580 T StaAgent::getWifiStatus() 0000000000000330 T StaAgent::setDhcp() 0000000000000790 T StaAgent::closeWifi() 00000000000009e0 T StaAgent::startWifi() 0000000000000000 T StaAgent::StaAgent(std::string const&) 0000000000000000 T StaAgent::StaAgent(std::string const&) 0000000000000080 T StaAgent::~StaAgent() 0000000000000080 T StaAgent::~StaAgent() U std::ctype<char>::_M_widen_init() const U std::ostream::put(char) U std::ostream::flush() U std::string::_Rep::_M_dispose(std::allocator<char> const&) U std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&) U std::runtime_error::runtime_error(std::string const&) U std::runtime_error::~runtime_error() U std::ios_base::Init::Init() U std::ios_base::Init::~Init() U std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, long) U std::__throw_bad_cast() U std::cout 0000000000000000 b std::__ioinit U typeinfo for std::runtime_error 所以连接器说是没有StaAgent::scanSsid()这个实现。
mujiok2003 2013-08-16
  • 打赏
  • 举报
回复
g++ -Wl,-O1 -Wl,-rpath,/opt/Qt5.1.0/5.1.0/gcc_64 -Wl,-rpath,/opt/Qt5.1.0/5.1.0/gcc_64/lib -o StaTest main.o StaAgent.o StaDialog.o moc_StaDialog.o -L/opt/Qt5.1.0//5.1.0/gcc_64/lib -lQt5Gui -lQt5Widgets -lQt5Core -lGL -lpthread
换一下顺序
g++ -Wl,-O1 -Wl,-rpath,/opt/Qt5.1.0/5.1.0/gcc_64 -Wl,-rpath,/opt/Qt5.1.0/5.1.0/gcc_64/lib -o StaTest main.o  StaDialog.o StaAgent.o moc_StaDialog.o -L/opt/Qt5.1.0//5.1.0/gcc_64/lib -lQt5Gui -lQt5Widgets -lQt5Core -lGL -lpthread
魔鬼筋肉人 2013-08-16
  • 打赏
  • 举报
回复
引用 1 楼 ouyh12345 的回复:
vector<Ssid_t> scanSsid(); status scanSsid(vector<Ssid_t> &);
你说的这种应该没问题。 但是我用值返回为什么不可以?C++ primer 三版的7.4有直接返回vector或list的例子。 StaAgent.cpp文件在编译时没有报错,所以为什么,在StaAgent::里就找不到这个scanSsid()函数了呢?
ouyh12345 2013-08-16
  • 打赏
  • 举报
回复
vector<Ssid_t> scanSsid(); status scanSsid(vector<Ssid_t> &);
魔鬼筋肉人 2013-08-16
  • 打赏
  • 举报
回复
似乎解决了,原来竟然是using的原因。 我试了下把返回至改为内置类型就可以: vector<int> scanSsid(); 于是我又把 using Ssid_t = struct { }; 改为 typedef struct { } Ssid_t; 竟然就可以了。 看来using和typedef还真不一样.

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧