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