如何“注册”我的库libfoo.so以将其与`-lfoo`链接?
>如何“注册”我的库foo.c,编译为libfoo.so,将其与-lfoo链接?是通过将其路径附加到LD_LIBRARY_PATH吗?是通过运行sudo ldconfig吗?
>为了好奇,我该向谁“注册”它?也就是说,哪个应用程序“需要知道”-coo对 gcc bar.c -lfoo的工作意味着什么?这是bash环境吗?是gcc吗?是内核吗? >对于静态库(例如libfoo.a),这有什么不同吗? 解决方法
如果您的库不在“标准”库目录中(例如/usr/local/lib或/usr/lib),那么当您链接它时,您需要告诉编译器它的位置-L:
$gcc -L/home/username/foo -Wall -o test main.c -lfoo | | |__ location of libfoo.so or libfoo.a |__ link libfoo.so or libfoo.a
> -L是搜索链接到可执行文件的库的位置 使用共享库时,有时仅仅链接它们是不够的(例如,如果库未安装在标准位置,例如上面显示的示例).这是使用LD_LIBRARY_PATH,rpath或ldcondig发挥作用的地方.静态库路径不需要像共享库一样设置,因为它们是使用可执行文件编译的. LD_LIBRARY_PATH $export LD_LIBRARY_PATH=/home/username/foo:$LD_LIBRARY_PATH 导出此变量会通知运行时链接程序查找与可执行文件关联的libfoo.so库的指定位置. LD_LIBRARY_PATH或多或少是设置库位置的临时或便捷方式. rpath $gcc -L/home/username/foo -Wl,-rpath=/home/username/foo -Wall -o test main.c -lfoo rpath与LD_LIBRARY_PATH的工作方式类似(因为库几乎可以驻留在userland中的任何位置),但是,rpath在编译时链接到可执行文件,并设置“固定”库位置. ldconfig 最终可能最好的解决方案是使用ldconfig,它为标准库位置和您可以指定的最新共享库创建必要的链接和缓存.它确实需要提升权限(例如sudo)以这种方式设置路径,并且应该在一定程度上谨慎使用. $sudo cp /home/username/foo/libfoo.so /usr/local/lib $sudo chmod 0755 /usr/local/lib/libfoo.so 这会将库复制到/usr/local/lib中,并将权限设置为每个人都可读. $sudo ldconfig $ldconfig -p | grep foo libfoo.so (libc6) => /usr/local/lib/libfoo.so 然后我们更新加载器缓存,并验证路径是否设置正确. $gcc -Wall -o test main.c -lfoo 通过使用ldconfig,现在不需要-L选项,LD_LIBRARY_PATH或rpath. 附加信息 ?Shared Libraries With GCC on Linux (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |