以下是使用ar(即libSOMTEHING.a
)构建的静态库中的函数的几种方法:
ld -o result myapp.o -Lpath/to/library -lname
ld -o result myapp.o path/to/library/libname.a
由于我们从命令行中省略了任何动态库,因此应该构建一个静态可执行文件。
有什么区别?例如,可执行文件中链接的是整个库,还是仅链接所需的函数?在第二个示例中,切换lib和对象文件的位置是否重要?
(附言:一些非GNU ld
链接器要求像-o
这样的所有选项都在第一个非选项文件名之前,在这种情况下,它们只接受-L... -lname
在myapp.o
之前)
在第一行中,在目录中的静态库(libname.a)之前搜索动态库(libname]so)。此外,还会在标准库路径中搜索libname.*,而不仅仅是/path/to/library。
来自"man ld"
在支持共享库的系统上,ld还可以搜索libnamespec.a以外的文件。特别是在ELF和SunOS上在系统中,ld将在目录中搜索名为libnamespec.so,然后再搜索一个名为libnamespec.a的按照惯例,".so"扩展表示共享库。)
第二行强制链接器使用路径/to/lib处的静态库。
如果没有构建动态库(libname.so),并且唯一可用的库是路径/to/library/libname.a,那么这两行将生成相同的"结果"二进制文件。