C “我怎么能?”;登记册;我的库libfoo.so是否将其与`-lfoo`链接?
我如何“注册”我的库C “我怎么能?”;登记册;我的库libfoo.so是否将其与`-lfoo`链接?,c,linux,bash,gcc,dynamic-linking,C,Linux,Bash,Gcc,Dynamic Linking,我如何“注册”我的库foo.c,编译成libfoo.so,并将其链接到-lfoo?是通过将其路径附加到LD_LIBRARY_path?是否通过运行sudo ldconfig 出于好奇,我应该向谁“注册”它?也就是说,哪个应用程序“需要知道”-lfoo是什么意思才能使gcc bar.c-lfoo工作?是bash环境吗?是gcc吗?它是内核吗 对于静态库(例如,libfoo.a)来说,这有什么不同吗 如果您的库不在“标准”库目录中,例如(例如/usr/local/lib或/usr/lib),则在链接
foo.c
,编译成libfoo.so
,并将其链接到-lfoo
?是通过将其路径附加到LD_LIBRARY_path
?是否通过运行sudo ldconfig
-lfoo
是什么意思才能使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
GCC假设所有库都以“lib”开头,以.so或.a结尾
(.a表示共享对象或共享库,而.a表示存档,
或静态链接库)
是搜索链接到可执行文件的库的位置-L
将库链接到可执行文件(-l
可以翻译为“linklibfoo.so库链接”)-lfoo
LD\u LIBRARY\u PATH
,rpath
或ldconfig
发挥作用的地方。静态库路径不需要像共享库一样设置,因为它们是用可执行文件编译的
导出此变量会通知运行时链接器在指定位置查找与可执行文件关联的libfoo.so
库LD_LIBRARY_PATH
或多或少是设置库位置的一种临时或方便的方法
rpath
的工作原理类似于LD_LIBRARY\u PATH
(因为库几乎可以驻留在用户区的任何地方),但是,rpath
在编译时链接到可执行文件,并设置“固定”库位置
最终,最好的解决方案可能是使用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\u LIBRARY\u PATH
或rpath
补充资料
↳ 将-L/directory/where/libfooso/sits添加到链接器命令行参数该应用程序就是链接器,名为
ld
。通过将库放置在默认搜索位置(通常为/usr/lib
),可以使用ld
对库进行“注册”。否则您需要通过<代码> -L/COD>参数。也许您考虑使用?我是否丢失了一些东西,或者为什么库在<代码> /UR/bin > /代码>?所以<代码> LDCONFIG < /代码>仅适用于标准位置的库(例如<代码> /Ur/Studio/LIB < /代码>)?(非常感谢您的回答,顺便说一句)@tale上同调:当然,您可以使用ldconfig
包含其他目录,例如(ldconfig/usr/local/foo
);这将更新运行时链接器使用的缓存,以在标准库路径之外包含您自己的库路径。不过,我建议谨慎行事——不要偏离它通常使用的路径类型;我之所以这样说,只是因为存在包含不安全或超出超级用户领域的目录的风险(例如,从ldconfig手册页:-我手动链接各个库。仅供专家使用。
)。我是链接新手,我不认为通过ldconfig更改ld缓存是可取的;这不等于将库安装到系统的默认路径,因为它会影响该系统上所有动态链接的软件吗?
$ sudo ldconfig
$ ldconfig -p | grep foo
libfoo.so (libc6) => /usr/local/lib/libfoo.so
$ gcc -Wall -o test main.c -lfoo