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

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

💡 原文中文,约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)导出。
➡️

继续阅读