C++ 导出内联声明的类函数

C++ 导出内联声明的类函数,c++,symbols,C++,Symbols,如果我有以下文件: class Foo { public: void bar() { } }; void baz() { } 编译它,并列出对象文件中的符号,我看到没有生成Foo::bar $ clang++ -c Foo.cpp $ nm -m Foo.o 0000000000000028 (__TEXT,__eh_frame) non-external EH_frame0 0000000000000000 (__TEXT,__text) external __Z3bazv 000

如果我有以下文件:

class Foo {
public:
    void bar() { }
};

void baz()
{
}
编译它,并列出对象文件中的符号,我看到没有生成Foo::bar

$ clang++ -c Foo.cpp
$ nm -m Foo.o
0000000000000028 (__TEXT,__eh_frame) non-external EH_frame0
0000000000000000 (__TEXT,__text) external __Z3bazv
0000000000000040 (__TEXT,__eh_frame) external __Z3bazv.eh
但是,如果我修改baz()以调用Foo::bar(),则会生成Foo::bar()符号(弱):

似乎只有在编译单元内调用内联声明的实例函数时才会生成该函数的代码,这看起来像是codegen/linker优化。但是,如果要创建共享库,可能无法导出实例函数(因为符号没有在任何地方定义)。这有点让人扫兴


显然,我可以解决这个问题,并在.cpp文件中定义不符合要求的实例函数。这个问题有更优雅的解决方案吗?

您的函数是在标题中定义的,如果您创建了一个共享库并希望与之链接,您还需要标题

给定头,编译器将以内联方式编译函数,这正是它的本意

这里没有真正需要解决的问题

$ clang++ -c Foo.cpp
$ nm -m Foo.o
0000000000000070 (__TEXT,__eh_frame) non-external EH_frame0
0000000000000000 (__TEXT,__text) external __Z3bazv
0000000000000088 (__TEXT,__eh_frame) external __Z3bazv.eh
0000000000000020 (__TEXT,__textcoal_nt) weak external automatically hidden __ZN3Foo3barEv
00000000000000b0 (__TEXT,__eh_frame) weak external __ZN3Foo3barEv.eh