【发布时间】:2015-06-20 02:02:39
【问题描述】:
我正在尝试将 GNU Coreutils 编译为一组共享库,而不是一组可执行文件。我认为make 会让我传入一个标志来告诉它这样做,但据我所知,我实际上必须修改 configure.ac 和 Makefile.am 才能使其工作。我不希望这样做,因为这可能会将错误引入我目前可以依赖的无错误的代码中。我尝试通过输入手动将目标文件转换为so's:
make CFLAGS='-fpic'
gcc -shared -o ls.so coreutils/src/ls.o
我能够创建 so 文件,但似乎缺少一些标志,而且我看不到任何方法可以访问编译和链接代码所需的标志列表(即使此信息明确包含在计算机中)。我唯一能想到的就是手动检查所有链接器错误并尝试找出缺少哪些标志,但我希望有一种不那么乏味的方法来获得我想要的东西。
【问题讨论】:
-
这样做的意义何在?你不能通过将代码放在
.so文件中来神奇地使独立程序表现得像一个库。 -
至少,您必须担心如何在每个程序的共享库中找到/调用
main()。通常,您有一个名为main()的函数。其他名称冲突呢?您还需要担心正确调用main()— 它是否依赖于envp参数(如int main(int argc, char **argv, char **envp))?它是否使用其他额外的参数? (我相信,Mac OS X 有额外的、额外的论据。)像你展示的那样改变 CFLAGS 可能会适得其反。通过这样做,您可能已经从编译器命令行中删除了很多标志。 -
不是已经有一个
coreutils-libs包并且里面唯一的文件是/usr/lib64/coreutils/libstdbuf.so吗?这是你想要做的吗? -
@jonathonI 我正在尝试将它们插入 GNU Guile,这为我提供了在 so 文件中指定函数所需的工具。根据 GNU 文档,[link gnu.org/software/automake/manual/html_node/… 是在运行时为用户保留的变量[/link](我知道许多开发人员可能不会在意,但这是一个官方的 bnu 项目)。
-
@alvits 好像有一个 RPM 包 coreutils-lib。我没有使用那个包管理器,但我会看看我是否可以在我的机器上安装它。