如果GCC只找到一个静态库而不是一个动态库,它会求助于静态链接找到的文件吗? 请考虑以下命令: gcc myfile.c -o myapp.exe -Lmydir -lmylib
如果GCC只找到一个静态库而不是一个动态库,它会求助于静态链接找到的文件吗? 请考虑以下命令: gcc myfile.c -o myapp.exe -Lmydir -lmylib,c,gcc,linker,C,Gcc,Linker,mydir包含以下文件: `libmylib.a` 我知道默认情况下,gcc希望进行动态链接。但是,正如您所看到的,它没有找到libmylib.so动态库,只有libmylib.a静态库 这是否意味着gcc将把libmylib.a静态链接到结果可执行文件中?此行为由链接器决定,而不是由gcc决定。标准链接器行为是在链接搜索路径的每个路径组件中尝试动态库,然后尝试静态库。例如,如果搜索的第一个目录只有一个名称为的静态库,那么第二个目录将根本不会被搜索,即使它有一个动态库。因此,为了正常的用户期望
mydir
包含以下文件:
`libmylib.a`
我知道默认情况下,gcc
希望进行动态链接。但是,正如您所看到的,它没有找到libmylib.so
动态库,只有libmylib.a
静态库
这是否意味着
gcc
将把libmylib.a
静态链接到结果可执行文件中?此行为由链接器决定,而不是由gcc决定。标准链接器行为是在链接搜索路径的每个路径组件中尝试动态库,然后尝试静态库。例如,如果搜索的第一个目录只有一个名称为的静态库,那么第二个目录将根本不会被搜索,即使它有一个动态库。因此,为了正常的用户期望正常工作,同一个库的相应动态和静态版本需要放在相同的位置。我会说是的。如果只找到库的一个版本,则选择该版本。因此,如果它是.a,那么它将静态链接。至少据我所知。但是我想你可以很容易地检查这个。在程序上使用ldd
,或者readelf-d myapp.exe | grep'NEEDED'
我明白了。是否存在“动态链接.a
静态库”或“静态链接.so
动态库”这样的东西?或者链接策略总是必须与文件类型匹配吗?不,没有这样的事情。如果输出为动态可执行文件,且当前模式为-b动态
,则首选动态库(如果存在)。如果当前链接模式为-Bstatic
,或者未找到动态库,但找到静态库,则静态库将静态链接到输出可执行文件中。这与可执行文件是动态的还是静态的无关。通过在-l
选项之间插入选项(使用-Wl
),可以在每个库的-Bstatic
和-Bdynamic
之间进行更改。