You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让g++找到.so共享对象文件并完成链接?

g++链接共享对象文件的正确方法及问题排查

你遇到的cannot find -lmy_func错误,核心原因是链接器的命名规则:当使用-lxxx参数时,链接器会自动查找名为libxxx.so(动态库)或libxxx.a(静态库)的文件。你生成的共享库是my_func.so,不符合lib前缀+库名+.so的命名规范,所以链接器找不到。

方案1:遵循链接器命名规则生成共享库

  • 生成符合规范的共享库(添加-fPIC生成位置无关代码,跨平台场景必备):
g++ my_func.cpp -shared -fPIC -o libmy_func.so
  • 链接编译main程序:
g++ main.cpp -L. -lmy_func -o main

-L.指定链接器在当前目录查找库文件,-lmy_func对应查找libmy_func.so。

方案2:直接指定共享库文件路径(无需修改库名)

如果不想调整共享库名称,直接在编译时指定.so文件的绝对或相对路径即可:

g++ main.cpp ./my_func.so -o main

这种方式跳过-l和-L的规则,直接让链接器处理指定的共享库文件。

运行时共享库加载注意事项

生成可执行文件后,系统运行时需要找到共享库,常用两种处理方式:

  • 临时设置环境变量:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/my_proj
./main
  • 编译时嵌入库路径(推荐):
    在编译main程序时添加-Wl,-rpath=.参数,将当前目录写入可执行文件的库搜索路径:
# 对应方案1的编译命令
g++ main.cpp -L. -lmy_func -Wl,-rpath=. -o main
# 对应方案2的编译命令
g++ main.cpp ./my_func.so -Wl,-rpath=. -o main

添加后可直接执行./main,无需手动设置环境变量。

内容的提问来源于stack exchange,提问作者Etay Livne

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 14:21:18