Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C “我怎么能?”;登记册;我的库libfoo.so是否将其与`-lfoo`链接?_C_Linux_Bash_Gcc_Dynamic Linking - Fatal编程技术网

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
      将库链接到可执行文件(
      -lfoo
      可以翻译为“linklibfoo.so库链接”)

    使用共享库时,有时仅仅链接它们是不够的(例如,如果库未安装在标准位置,如上图所示)。这就是使用
    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