静态链接库时,收到链接器错误:找不到 -lgcc_s
When statically linking a library, getting Linker error : cannot find -lgcc_s
我想静态链接一个库,比如libcurl。由于静态库和共享库都在同一个文件夹中,我使用 -wl,-Bstatic 让链接器知道使用静态库。
g++ -o prog prog.o -Wl,-Bstatic -lcurl.
但是上面的命令给出了错误:
/usr/bin/ld: cannot find -lgcc_s
如果我排除 -wl,-bstatic,它工作正常,但它将使用我不想要的共享库。
出了什么问题?
当您使用g++
前端执行链接时,例如:
g++ -o prog prog.o -Wl,-Bstatic -lcurl
g++
调用链接器,将链接选项传递给它,并且以静默方式传递 向链接器命令行添加了大量样板选项, 对于C++联动是不变的。
例如,您的C++程序很可能需要链接标准C++库,libstdc++
,但您的g++
命令没有提及它。它当然还需要标准的 C 库, 但也没有提到。g++
会自动添加链接选项来链接这些和 其他库。
您可以通过运行链接来查看g++
添加到链接中的所有样板 详细模式。您将看到类似以下内容:
$ g++ -v -o prog prog.o -Wl,-Bstatic -lcurl
...
...
COLLECT_GCC_OPTIONS='-v' '-o' 'prog' '-shared-libgcc' '-mtune=generic' '-march=x86-64'
/usr/lib/gcc/x86_64-linux-gnu/7/collect2 -plugin /usr/lib/gcc/x86_64-linux-gnu/7/liblto_plugin.so
-plugin-opt=/usr/lib/gcc/x86_64-linux-gnu/7/lto-wrapper
-plugin-opt=-fresolution=/tmp/cckwrJp6.res -plugin-opt=-pass-through=-lgcc_s
-plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lc
-plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc
--sysroot=/ --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu
--as-needed -dynamic-linker /lib64/ld-linux-x86-64.so.2 -pie -z now -z relro
-o prog /usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/Scrt1.o
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/crti.o
/usr/lib/gcc/x86_64-linux-gnu/7/crtbeginS.o
-L/usr/lib/gcc/x86_64-linux-gnu/7 -L/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu
-L/usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib -L/lib/x86_64-linux-gnu
-L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib
-L/usr/lib/gcc/x86_64-linux-gnu/7/../../.. prog.o
-Bstatic -lcurl -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc
/usr/lib/gcc/x86_64-linux-gnu/7/crtendS.o
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/crtn.o
/usr/bin/x86_64-linux-gnu-ld: cannot find -lgcc_s
/usr/bin/x86_64-linux-gnu-ld: cannot find -lgcc_s
collect2: error: ld returned 1 exit status
请特别注意您的-Bstatic
选项和以下链接选项:
-Bstatic -lcurl -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc
/usr/lib/gcc/x86_64-linux-gnu/7/crtendS.o
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/crtn.o
其中包括您的-lcurl
以及默认系统库:
-lcurl -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc
然后查看-Bstatic
链接器选项的文档:
-静态
。
不要链接到共享库。这仅在支持共享库的平台上有意义。 此选项的不同变体是为了与各种系统兼容。 您可以在命令行上多次使用此选项:它会影响库搜索它后面的 -l 选项。此选项还意味着 --未解析符号=全部报告。此选项可与 -shared 一起使用。 这样做意味着正在创建一个共享库,但该库的所有外部库 必须通过从静态库中提取条目来解析引用。
[我的强调]
因此,-Bstatic
选项会将链接器定向到链接以下各项的静态版本:
-lcurl -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc
它查找已安装的静态libcurl.a
。它找不到-lgcc_s
的静态库,因为上未安装任何libgcc_s.a
您的系统。你只有这个和其他基本系统库的动态版本, 这很正常。
如果希望链接器仅针对指定的-l
选项链接静态库,则必须在-l
选项之前打开-Bstatic
并将其关闭 在它们之后,-Bdynamic
,即使这使-Bdynamic
成为命令行上的最后一件事。 因为g++
(或任何其他GCC前端,gcc
,gfortran
...(将添加-l
后台命令行的选项。链接如下:
g++ -o prog prog.o -Wl,-Bstatic -lcurl -Wl,-Bdynamic
以修复此特定链接错误。
- 链接器找不到在虚拟类 c++ 中访问的静态字段的符号
- C++线程找不到函数作为参数(链接器)
- Red Hat:使用<atomic>编译很好,但链接器找不到__atomic_store_16;什么库?
- 找不到 CMake 链接的库
- 静态链接库时,收到链接器错误:找不到 -lgcc_s
- 链接器找不到导入的 DLL 的 LIB 文件
- 链接器找不到库,即使我用 -L 指定了它的位置
- 链接器错误-在ubuntu中找不到CMake和Cuda 10.1的lcudart
- 编译器找不到链接的 OpenCV 库
- 我找不到瓦尔格林德告诉我的记忆链接
- 运行程序时找不到共享对象库,但在编译过程中链接了它
- 链接器找不到 Lua 库定义
- libGL确实存在,但链接器找不到它 - Qt 4.8.7,CentOS 7.5
- C++ XCODE ld:找不到体系结构x86_64 clang 的符号:错误:链接器命令失败,退出代码为 1(使用 -
- C++:找不到静态链接
- C++链接编辑器找不到函数声明(未定义的引用)
- Ogre 3D共享库与CMAKE链接时,在Linux上执行二进制时找不到
- 使用 msvc /MDd cryptlib.lib 构建 Crypto++ 链接时找不到 cryptopp.lib
- 与 dlopen 的动态链接:找不到符号
- Cmake,子目录和Google测试(模拟)无法正确链接.找不到测试