编译为"共享库"的源代码

source compiled to 'shared library'

本文关键字:源代码 共享 编译      更新时间:2023-10-16

我有一个简单的源文件'source.cpp:

#include <iostream>
using namespace std;
int main() {
    int ival(0);
    cout << "Bitte eine Ganzzahl: ";
    cin >> ival;
    cout << "Sie gaben die Zahl " << ival << " einn";
    cout << "Ein Monster mit "
        << "zwei Zeilenn";
    return 0;
}

现在,我正在使用:

进行编译
g++ source.cpp -o out

该结果在Thunar中显示为"共享库"。我可以用。

ldd说:

linux-vdso.so.1 (0x00007fffb55be000)
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00007fd5d4387000)
libm.so.6 => /usr/lib/libm.so.6 (0x00007fd5d403b000)
libgcc_s.so.1 => /usr/lib/libgcc_s.so.1 (0x00007fd5d3e24000)
libc.so.6 => /usr/lib/libc.so.6 (0x00007fd5d3a6d000)
/lib64/ld-linux-x86-64.so.2 => /usr/lib64/ld-linux-x86-64.so.2 (0x00007fd5d4910000)

当我设置 - 静态标志时,我会得到一个典型的"程序",并且它在Thunar上工作,但肯定会更大。LDD说"该程序没有动态链接"

几年前,我编制了此消息来源,但我不记得编译器选项,并且在典型的"程序"中有一个未静态链接的典型"程序"。LDD说的与第一个示例中的同样。

所以,我该怎么做才能通过双击文件管理器中的双击可以执行的"程序"可执行文件。

(我当然在所有示例中设置了可执行文件(

我在Thunar上也有类似的问题,因为我正在构建的可执行文件将被编译到"共享库"中。而不是可执行的。当我使用-fno -pie编译时,我会得到错误:重新定位R_X86_64_32针对`.rodata.str1.8''在制作PIE对象时无法使用;与-fpie重新编译。当然,-fpie会导致可执行文件被编译为"共享库"。换句话说,我无法通过更改编译器开关来解决问题。所以我写了一个bash脚本作为工作。

runsharedlibraryasexe.sh
#!/bin/bash
"$1" &

然后,当我双击Thunar以运行" EXE/共享库"时我告诉Thunar用这个脚本打开它。

注意:Bash脚本必须标记为可执行文件。

我希望这会有所帮助。我真的希望我能找到一种将我的应用程序编译到可执行文件中的方法。