Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果GCC只找到一个静态库而不是一个动态库,它会求助于静态链接找到的文件吗? 请考虑以下命令: gcc myfile.c -o myapp.exe -Lmydir -lmylib_C_Gcc_Linker - Fatal编程技术网

如果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
之间进行更改。