Lazarus在Linux上使用自定义动态库
前置知识 Windows上叫动态链接库,通常以*.dll形式命名;Linux上叫共享库,通常以lib*.so形式命名。(此处统一叫动态库) Windows上dll路径的一般搜索顺序为:当前目录->系统目录(如:C:\Windows\System32、C:\Windows\SysWOW64)->Windows目录(如C:\Windows)->PATH环境变量指定的目录。 Linux上so路径的一般搜索顺序为:编译时使用-rpath指定的路径->LD_LIBRARY_PATH环境变量指定的路径->系统默认库路径(如/lib、/usr/lib等)->/etc/ld.so.conf和/etc/ld.so.conf.d/目录中配置的路径。 Lazarus/Delphi调用动态库有两种形式:静态调用和动态调用。 静态调用:主程序启动时加载,若动态库不存在或不匹配,则主程序抛异常并中止;主程序退出时卸载。 动态调用:主程序在需要时可随时加载,不需要时可随时卸载;动态库发生异常时,一般不会导致主程序中止。 使用动态库 动态库 动态库本身不需要特殊设置,正常编译、构建即可。(以名为dll的动态库为例,实际文件名为libdll.so) 主程序 编译时 静态调用方式 主程序直接编译会报错:Warning: linker:/usr/bin/ld: cannot find -ldll: No such file or directory,意思是链接器找不到名为dll的动态库文件。 解决方案 打开Project Options->Compiler Options->Compilation and Linking,勾选Pass options to linker with "-k", delimiter is space,并在下方填入-L’动态库所在路径’,保存即可正常编译。 动态调用方式 主程序直接编译即可。 运行时 静态调用方式 此时编译后的程序并不能正常运行,会报错error while loading shared libraries: libdll.so: cannot open shared object file: No such file or directory,意思是加载动态库时找不到名为libdll.so的动态库文件。 这是前面提到的路径搜索顺序导致的,可将动态库放入相应的搜索路径下,也可使用-rpath指定路径。对于自定的动态库,建议使用-rpath指定路径,最好指定的路径为当前路径(与Windows保持一致)。 解决方案 打开Project Options->Compiler Options->Compilation and Linking,勾选Pass options to linker with "-k", delimiter is space,并在下方填入-rpath='$ORIGIN'(与之前的-L’动态库所在路径’之间要添加一个空格),保存并重新编译,即可正常运行。...