我正在尝试使用通过 -fPIC 命令创建的多个 .O 文件来创建共享对象。 当我使用 -shared 参数运行 g++ 时,它似乎试图静态链接到 libstdc++.a 库,这当然会失败。 我试图弄清楚为什么当我不使用 -static-stdc++ 参数时它会自动尝试静态链接。
当我尝试创建共享对象时,出现错误 ...libstdc++.a(ios) relocate R_x86_64_325 against 'vtable for std::ios_base': 制作共享对象时无法使用
我使用 -V 参数运行 G++ 并收到,可以看到 LD 接收到参数 -lstdc++。
将单个共享对象链接在一起时,您需要从现有的 .o 文件中执行此操作。您无法从现有的 .so 文件执行此操作;这会将这些 .so 文件链接到您的 .so 文件,但不会链接到您的 .so 文件。因此,gcc 寻找并找到 .o 文件 (.a) 的存档并尝试链接它们。但由于它们不是为重定位而编译的(无 -fPIC),因此它们不能用于创建 .so 文件。 您的选择是:
将 .so 动态链接到 libstdc++(从而使其取决于系统中安装的 .so 文件)
gcc -shared -lstdc++ -o your.so yourfiles.o
truss
您的 g++ 运行来查找它打开库的顺序。