链接动态库在不同操作系统上的行为

链接动态库在不同操作系统上的行为

💡 原文中文,约11700字,阅读约需28分钟。
📝

内容提要

在Windows和Linux上开发C++程序时,库的生成和链接方式不同。Linux静态库为.a,动态库为.so;Windows分别为.lib和.dll。编译时需注意库路径设置,Linux用RPATH和LD_LIBRARY_PATH,Windows依赖DLL导入库。CMake可简化构建,优化动态库链接。Windows常用`__declspec(dllexport)`导出符号。

🎯

关键要点

  • 在Windows和Linux上开发C++程序时,库的生成和链接方式不同。

  • Linux静态库以.a结尾,动态库以.so结尾;Windows分别为.lib和.dll。

  • 编译时需注意库路径设置,Linux使用RPATH和LD_LIBRARY_PATH,Windows依赖DLL导入库。

  • CMake可简化构建,优化动态库链接。

  • Windows常用__declspec(dllexport)导出符号。

  • 生成动态库和静态库的命令示例:gcc -shared -fPIC -o libfoo.so foo.c和ar cr libfoo.a libfoo.o。

  • 链接动态库时需要设置路径,使用-gcc -o main main.c -I/home/alice/foo -lfoo。

  • CMake在构建时默认添加动态库路径,安装时RPATH默认为空。

  • Linux动态链接器根据RPATH、LD_LIBRARY_PATH和系统默认路径查找共享库。

  • Windows没有类似Linux的RPATH机制,使用DLL时需要.lib文件。

  • 隐式链接和显式链接是Windows中使用DLL的两种方式。

  • 动态库查找路径在Windows中比较复杂,涉及多个搜索顺序。

  • 总结:Linux使用CMake开发时使用RPATH,Windows开发动态库时使用__declspec(dllexport)导出。

延伸问答

在Windows和Linux上,动态库的文件后缀分别是什么?

Windows上的动态库后缀为.dll,Linux上的动态库后缀为.so。

如何在Linux中设置动态库的搜索路径?

在Linux中,可以通过设置RPATH和LD_LIBRARY_PATH来指定动态库的搜索路径。

CMake在构建动态库时有什么默认行为?

CMake在构建时默认添加动态库的RPATH,但安装时RPATH默认为空。

Windows中如何导出动态库的符号?

在Windows中,可以使用__declspec(dllexport)来导出动态库的符号。

在Windows中,隐式链接和显式链接有什么区别?

隐式链接是在程序启动时自动加载DLL,而显式链接是在运行时按需加载DLL。

在Linux中,动态链接器是如何查找共享库的?

动态链接器根据RPATH、LD_LIBRARY_PATH和系统默认路径的顺序查找共享库。

🏷️

标签

➡️

继续阅读