我主要在Windows工作,最近我开始在Linux工作。我有个疑问。我在Windows中使用Visual Studio作为IDE,在Linux中使用了Makefile。
Windows(VC ++)中有两种类型的库,静态库(.lib)和DLL。很明显(不是吗?)如果我链接lib文件我使用静态链接其他动态链接。
现在当我使用g ++编译器时,为什么我需要明确提到-Bstatic/-static
或Bdynamic/-dynamic
标志。因为如果文件是.a文件,那么我必须使用静态链接,如果文件是.so我使用动态链接。
答案 0 :(得分:1)
有些时候,您希望“强制”编译器执行通常不会执行的操作。特别是-static在您希望代码运行的另一台机器上构建可能未安装[或未安装相同版本]的库时非常有用。
如果您希望静态链接一个库,而不是代码使用的每个库,则-Bdynamic非常有用。
e.g。 gcc -o myprog myprog.o -Wl,-Bstatic -lspecial -Wl,-Bdynamic
将使用myprog
的静态链接链接libspecial
(可能是广泛分发的内容,例如您自己构建的内容)
对于一般的本地开发,您也不需要。
答案 1 :(得分:0)
在GNU工具链和其他Unix编译器中,通常不指定库的完整路径;你给链接器一个标志,如
-lfoo
并让它弄清楚它是否应与libfoo.a
,libfoo.so
以及这些文件所在的位置相关联。当只有一个静态库可用时,它将与之链接。
因此,除了少数特定情况外,您并不需要指定-Bstatic
。动态链接是默认设置,如果您不想动态链接自定义库,那么就不要在其中构建.so
。
此外,可以通过向链接器提供完整的文件名来显式链接静态库
gcc -o some_binary main.o libfoo.a
获取动态链接的二进制文件,其中libfoo
静态链接在。
答案 2 :(得分:0)
我认为你已经倒退了。我是否正在联系
我需要一个动态库或静态库,在Windows下
一个.lib
文件;它们不是以同样的方式生成的,
并且不包含相同的东西。在Unix下,当我链接时
一个共享对象,我直接链接到.so
文件,而不是
针对同时生成的一些其他文件。
选项-Bstatic
和-Bdynamic
才会发挥作用
.so
和.a
都存在于同一目录中;他们
告诉链接器为指定的库选择哪一个
使用-l
选项。在Windows中,这种情况不会发生;
由于.lib
需要.dll
,因此您无法拥有.lib
在同一目录中静态链接。
答案 3 :(得分:0)
因为如果文件是.a文件,那么我必须使用静态链接,如果文件是.so,我使用的是动态链接。
这些文件名“扩展名”只是人类惯例 - 没有理由他们分别拥有 .a
和.so
。 GCC没有强迫我们加入那个惯例。