使用GCC导出C ++类的符号

时间:2016-09-22 09:17:54

标签: c++ gcc

我使用dlopen来合并动态加载的库及其主机的符号,在主机中我有一个类:

class Foo {
public:
    Foo() {/* ... */}
    void bar() {/* ... */}
};

int main() {
    // Foo foo;
    return 0;
}

我正在使用g++ -Wl,--export-dynamic -o test test.cpp进行编译,并使用nm -g test检查符号。 我希望符号_ZN3FooC1Ev_ZN3FooC2Ev存在于可执行文件中,因为动态库需要它们,但除非我通过取消注释上面的行来使用它们,否则它们不会出现。我相信它正在优化,因为GCC认为不需要它。

如何强制将Foo的构造函数和方法包含在主机二进制文件中?

2 个答案:

答案 0 :(得分:3)

如果您至少没有定义对象,则带有内联方法定义的类定义不会生成任何符号。 因此,如果您想确保其可见性,请不要将这些方法定义为内联...

答案 1 :(得分:0)

为了生成动态加载的库,您可以使用以下命令构建它:

$ gcc -shared -fPIC -o lib1.so lib1.c

-fPIC 用于告诉GCC生成位置独立代码 - 共享用于表示它是共享对象

要链接到您的库test.so您可以使用以下内容:

$ gcc -L$(pwd) -Wl,-rpath=$(pwd) --enable-new-dtags -o test main.c -l1 -l2

使用 -rpath = / my / location ,您可以告诉链接器备用位置列表
要验证二进制文件的动态部分,您可以使用:$ readelf -d test