【问题标题】:GNU C : How can I compile a C program with dynamic library option -lmylib but without -L optionGNU C:如何编译带有动态库选项 -lmylib 但没有 -L 选项的 C 程序
【发布时间】:2016-02-04 11:57:28
【问题描述】:

我已经使用了几个库,例如 pthread 作为 -lpthreadmath 作为 -lmath 但我不需要使用 -L 选项来指定链接路径。

但是,

  1. 我通过编译我的程序mylib.c 创建了一个库mylib gcc -fPIC mylib.c -o libmylib.so
  2. 把它放在/usr/local/lib/libcustom
  3. 在文件中添加了路径/usr/local/lib/libcustom /etc/ld.so.conf.d/libcustom.conf
  4. 运行ldconfig
  5. 运行export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib/customlib
  6. 创建了一个sample.c,调用了mylib中的函数

现在,当我编译 sample.cgcc -L /usr/local/lib/customlib -o sample.o -lmylib 时,它工作正常,而当我尝试 gcc sample.c -o sample.o -lmylib 时,它给出的 ld 错误为 /usr/bin/ld: cannot find -lmylib

我想知道为什么-L 标志在-lpthread 的情况下是可选的,而在-lmylib 的情况下是强制性的?在-lmylib的情况下如何跳过-L的使用?

谢谢。

【问题讨论】:

  • 尝试“ldconfig -p | grep -i mylib”检查您的库是否存储在当前缓存中
  • 因为系统(链接器)已经知道在哪里可以找到libpthread,但不知道在哪里可以找到libmylib

标签: c gcc gnu ld dynamic-library


【解决方案1】:

您正在寻找LIBRARY_PATH

LD_LIBRARY_PATH 用于在运行时加载动态库,而不是编译时。


附注:添加到现有环境变量时,请确保使用$LD_LIBRARY_PATH 而不仅仅是LD_LIBRARY_PATH。否则,您将丢弃原始内容并输入文字文本LD_LIBRARY_PATH

所以它应该从:

export LD_LIBRARY_PATH=LD_LIBRARY_PATH:/usr/local/lib/customlib

到:

export LIBRARY_PATH=$LIBRARY_PATH:/usr/local/lib/customlib

【讨论】:

  • 谢谢!我一直在寻找一种解决方案,使我的自定义库与系统库区分开来,并且链接器会自动识别该库。
  • LIBRARY_PATH 是你要找的,然后:)
【解决方案2】:

因此,您需要将 mylib 放置在链接器已知的路径中。例如像 /usr/lib 或 /usr/local/lib 这样的地方。在您的情况下,它适用于 pthread,因为它已经位于系统已知路径中。

【讨论】:

    猜你喜欢
    • 2014-10-10
    • 2012-08-07
    • 1970-01-01
    • 2012-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多