Re: [问题]c++ virtual 问题

楼主: sarafciel (Cattuz)   2018-07-28 12:01:14
※ 引述《gigigigi (gigigigi)》之铭言:
: 开发平台(Platform): (Ex: Win10, Linux, ...)
: Linux
: 编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出)
: g++
: 额外使用到的函数库(Library Used): (Ex: OpenGL, ...)
: N/A
: 问题(Question):
: https://www.sendspace.com/file/7gq1j2 这是我程式码地方
: 我是在把一个 继承class 打包 so档案 之后透过 dlopen load 这个so
: 如果我把 triangle.hpp 里面的 virtual void getaa() const;
: 的virtual拿掉会编译阶段的link 错误无法编译过
: 但是我把这程式码单独写在同个档案, 不用so + dlopen 是正常可以编译过
: 不懂为什么 so 方式去dlopen link 阶段会错
: 错误讯息如下:
: g++ -Wall -pedantic -ggdb3 -O0 -std=c++11 -shared -fPIC -o triangles.so
: triangle.cpp
: g++ -Wall -pedantic -ggdb3 -O0 -std=c++11 main.cpp -o main -ldl -lpthread
: /tmp/ccB1oVpb.o: 于函式 main:
: dlopen_test/main.cpp:42: 未定义参考到 triangle::getaa() const
: collect2: error: ld returned 1 exit status
: Makefile:9: recipe for target 'a.out' failed
: make: *** [a.out] Error 1
: 谢谢
这个要讲起来好复杂....XD
类别的成员函式没有带virtual前缀的话 就是一个"函式"
编译时只要在你主程式的执行中有用到这个函式
就要在编出来的elf里面留symbol跟code,这个是静态连结的主要工作
所以你下参数编main的时候,他找不到getaa的code不给过
这是很正常的情况,因为你没带有getaa的triangle.cpp给他
那反过来看带virtual的case,virtual function实际上是一个"函式指标"
(以下简称vptr)
他跟函式最大的不同是
作者: gigigigi (gigigigi)   2018-07-29 20:57:00
感谢 解惑

Links booklink

Contact Us: admin [ a t ] ucptt.com