如何让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
相关产品推荐
相关产品推荐

