静态库“接口”

4
有没有办法告诉编译器(gcc/mingw32),在构建对象文件(lib*.o)时只从.c文件中公开某些函数?我想这样做的原因是,我正在静态链接到一个超过100,000行的库(SQLite),但我只使用其中的几个函数。如果我可以告诉编译器只公开那些函数,它将优化掉所有从未需要的函数的代码,从而大大减小库的大小。
2个回答

1

我找到了几个可能的解决方案:

这就是我所询问的。它是Windows的dllexport在gcc中的等效物:

我还发现了链接时代码生成。这使得链接器能够看到实际使用的代码部分并摆脱其余部分。将其与strip-fwhole-program一起使用,可以大大提高我的结果。

注意:仅当您不将整个程序编译为一次调用gcc时,此标志才有意义,这就是我所做的(创建一个sqlite.o文件,然后静态链接它)。

我找到的第三个选项,但还没有研究过,可以在这里看到:


0
这可能是连接器的职责,而不是编译器的。当将其作为程序 (.exe) 进行链接时,连接器将负责仅导入相关符号;当链接 DLL 时,__dllexport 机制可能是您要寻找的内容,或者 ld 的一些标志可以帮助您 (man ld)。

我正在使用 .so 文件,而非 DLL 文件。我认为一旦源代码被编译,链接器就无法知道哪些部分被需要,必须导入整个文件。 - Baruch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接