Cgo在使用了动态库的情况,通过了编译,在运行时候推出程序并提示下面错误
....
test2json: exit status 3221225781
这是应为在编译时能够找到对应的动态文件而在运行时无法找到的原因。
解决
可以有多种方式解决该问题。
通用的解决方法:
- 把动态库文件放置于可执行程序的相同路径。
如果是测试文件(
_test.go
)中需要调用cgo出现该问题,因为在运行_test
时是在操作系统的临时文件目录下生成的测试可执行文件。
所以需要把动态库放置于用户的临时文件目录中
例如windows的用户临时目录为:C:\Users\{你的系统用户名}\AppData\Local\Temp
Windows平台:
- 可将dll文件所处的目录绝对路径,加入到在windows环境变量PATH中。
Linux:
- 设置LD_LIBRARY_PATH环境变量
MacOS:
- 设置DYLD_LIBRARY_PATH环境变量
原理
动态库的查找根据不同平台有不同的表现:
Linux:
- 可执行文件同目录下的动态链接库;
- 编译时指定的动态链接库位置(
-Wl,-rpath=< thirdparty lib_path >
); - 使用LD_LIBRARY_PATH环境变量指定的动态链接库位置,可以在/etc/profile或者用户profile文件设置;
/lib
或/usr/lib
中的动态链接库;- /etc/ld.so.conf中指定的动态链接库位置(需要使用
ldconfig
命令使其生效);
Windows:
- 可执行文件所在的目录;
- Windows 系统目录
C:\WINDOWS\System32
; - Windows 目录
C:\WINDOWS\
; - PATH 环境变量中列出的目录;
参考文献
- [1]. Go语言高级编程 . 柴树杉,曹春晖 . https://chai2010.cn/advanced-go-programming-book/ch2-cgo/ch2-09-static-shared-lib.html
- [2] Linux下运行时动态库查找方式与优先级顺序 . CSDN . Yanggle Yang . https://blog.csdn.net/yanggleyang/article/details/105287424?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param
- [3]. Linux动态链接库加载顺序. 博客园 . 木易不是楊 . https://www.cnblogs.com/FanZZ/p/6658659.html
- [4]. Windows下DLL查找顺序 . 博客园 . Tocy . https://www.cnblogs.com/tocy/p/windows_dll_searth_path.html