【发布时间】:2017-02-20 05:53:32
【问题描述】:
我有文件 foo.c bar.c 和 baz.c,加上包装代码 myfn.c 定义了一个函数 myfn(),该函数使用来自其他文件的代码和数据。
我想创建一个目标文件或存档文件,myfn.o 或 libmyfn.a,以便 myfn() 可以用于其他项目,而无需同时从 {foo,bar,baz 导出大量符号}.o 也是如此。
在 Linux/gcc 中正确的做法是什么?谢谢。
更新:我找到了一种方法。我最初应该强调这是关于静态档案,而不是 DSO。无论如何,食谱:
#define PUBLIC __attribute__ ((visibility("default")))然后在myfn.c中将myfn()标记为PUBLIC。不要标记其他任何内容PUBLIC。使用
gcc -c foo.c bar.c baz.c myfn.c -fvisibility=hidden编译对象,这会将除myfn()之外的所有内容都标记为隐藏。使用
ld的部分链接开关创建便捷存档:ld -r foo.o bar.o baz.o myfn.o -o libmyfn.a将所有不是
PUBLIC的内容本地化,如下所示:objcopy --localize-hidden libmyfn.a现在
nm说myfn是libmyfn.a中唯一的全局符号,随后链接到其他程序就可以正常工作:gcc -o main main.c -L. -lmyfn(这里,程序调用myfn();如果它试图调用foo()然后编译会失败)。
如果我在第 3 步中使用 ar 而不是 ld -r,则在第 5 步中编译失败:我猜 ar 尚未将 foo 等链接到 myfn,并且一旦这些函数被链接,则不再可以本地化,而 ld -r 在链接被本地化之前解析链接。
我欢迎任何确认这是“正确”方式或描述实现相同目标的更巧妙方式的回复。
【问题讨论】:
-
正确的方法是查找有关图书馆创建的文献或教程。
-
请帮我张贴这个答案,尤金,这样我就可以否决它。谢谢。
标签: c gcc linker visibility symbols