在内置MySQL存储引擎的实现中,存在具有以下结构的类:
notify_table_changed()
据我所知,由于handler.h
将遗漏handler.cc
的vtable条目,因此会出现链接错误。这是supported by the gcc FAQ。
指向相关MySQL类的链接:
ha_innopart.h
:https://github.com/mysql/mysql-server/blob/67d52e7c7a1a23424e39273cbb6f5f9d56fda8d1/sql/handler.h#L3518-L3523 #include <stdio.h>
class A {
public:
virtual int foo();
};
class B : public A {
public:
int foo(); // Will work by commenting out this line...
};
int A::foo() { return 42; }
// int B::foo() { return 24; } // ...or uncommenting this line.
int main(int argc, char **argv) {
B b;
::printf("%d\n", b.foo());
}
:https://github.com/mysql/mysql-server/blob/67d52e7c7a1a23424e39273cbb6f5f9d56fda8d1/sql/handler.cc#L4736-L4744 $ g++ test.cc -o test && ./test
/tmp/ccAiCHry.o: In function `main':
test.cc:(.text+0x32): undefined reference to `B::foo()'
/tmp/ccAiCHry.o: In function `B::B()':
test.cc:(.text._ZN1BC2Ev[_ZN1BC5Ev]+0x1f): undefined reference to `vtable for B'
collect2: ld returned 1 exit status
:https://github.com/mysql/mysql-server/blob/67d52e7c7a1a23424e39273cbb6f5f9d56fda8d1/storage/innobase/handler/ha_innopart.h#L306-L307 以下代码重现了这个问题,正如我所看到的那样:
B
编译它给出:
foo()
如上述评论中所述,可以通过评论foo()
B
的声明或为{{1}提供$ !!
g++ test.cc -o test && ./test
42
$ !!
g++ test.cc -o test && ./test
24
的实施来解决此问题}}。这些案件的输出分别是:
ha_innopart::notify_table_changed()
那么,MySQL如何实现AbstractUser
并且仍能够无错误地编译和链接?
答案 0 :(得分:0)
事实证明ha_innopart
的实现在几个文件中被分解,并且实现确实存在:
handler0alter.cc
:https://github.com/mysql/mysql-server/blob/67d52e7c7a1a23424e39273cbb6f5f9d56fda8d1/storage/innobase/handler/handler0alter.cc#L8927-L8938 我在搜索用途时找到了实现。
https://github.com/mysql/mysql-server/search?utf8=%E2%9C%93&q=notify_table_changed