c语言编译,链接后,最终的生产代码没有留下方法名,结果,这段代码不能被其他人用作api,这是对的吗?
经过一些搜索工作,我发现如果你想构建一个库,你只需要将-c开关添加到gcc,然后使用命令ar。因此,这意味着当使用带有-c开关的gcc编译时,编译后的代码保留了方法名称,那么它是否意味着windows提供的所有api都是在编译之后但是在链接之前?但是,根据我的理解,代码在链接之前无法运行或链接为库,因此上面的猜测是错误的。那么如何理解这些问题?
答案 0 :(得分:2)
您正在混淆三种编译器输出:静态库,动态库和可执行文件。
静态库基本上由.o
个目标文件的档案组成,可以在链接时添加到您的程序中,并包含(“静态链接”)到最终程序中。这是您用-c
引用的“库”。通常,它们具有.lib
(Windows)或.a
(Linux)文件扩展名。
动态库由已编译的代码组成,这些代码通过特殊选项链接在一起(例如,GCC为-shared
)。动态库保留 public 符号,使其可供其他程序使用。如果针对动态库编译程序,则最终程序仅包含引用到库中 - 实际代码将动态包含在运行时。这是Windows上扩展.dll
的含义 - “动态链接库”。通常,它们具有.dll
(Windows),.so
(Linux)或.dylib
(OS X)文件扩展名。
可执行文件由已编译的代码组成,这些代码以通常的方式链接在一起,使它们可以直接运行。虽然一些可执行文件保留符号信息用于调试目的,但它们通常不能动态加载,并且其代码通常不能被其他程序使用(这就是您在问题中使用“最终生产代码”的意思)。
希望能够消除困惑。