隐藏了创建c语言库

时间:2016-03-02 23:32:56

标签: c gcc compilation

c语言编译,链接后,最终的生产代码没有留下方法名,结果,这段代码不能被其他人用作api,这是对的吗?

经过一些搜索工作,我发现如果你想构建一个库,你只需要将-c开关添加到gcc,然后使用命令ar。因此,这意味着当使用带有-c开关的gcc编译时,编译后的代码保留了方法名称,那么它是否意味着windows提供的所有api都是在编译之后但是在链接之前?但是,根据我的理解,代码在链接之前无法运行或链接为库,因此上面的猜测是错误的。那么如何理解这些问题?

1 个答案:

答案 0 :(得分:2)

您正在混淆三种编译器输出:静态库动态库可执行文件

静态库基本上由.o个目标文件的档案组成,可以在链接时添加到您的程序中,并包含(“静态链接”)到最终程序中。这是您用-c引用的“库”。通常,它们具有.lib(Windows)或.a(Linux)文件扩展名。

动态库由已编译的代码组成,这些代码通过特殊选项链接在一起(例如,GCC为-shared)。动态库保留 public 符号,使其可供其他程序使用。如果针对动态库编译程序,则最终程序仅包含引用到库中 - 实际代码将动态包含在运行时。这是Windows上扩展.dll的含义 - “动态链接库”。通常,它们具有.dll(Windows),.so(Linux)或.dylib(OS X)文件扩展名。

可执行文件由已编译的代码组成,这些代码以通常的方式链接在一起,使它们可以直接运行。虽然一些可执行文件保留符号信息用于调试目的,但它们通常不能动态加载,并且其代码通常不能被其他程序使用(这就是您在问题中使用“最终生产代码”的意思)。

希望能够消除困惑。