【问题标题】:Compiling .c source file and .so dynamic library together一起编译.c源文件和.so动态库
【发布时间】:2017-11-30 16:23:04
【问题描述】:

我一直在尝试编译一个带有 main 方法的 C 源文件 (driver.c) 和一个动态库 (libhello.so) 文件,该文件包含 main 方法中使用的函数的所有实现。

我用

制作.so文件
gcc -shared -o libhello.so -fPIC hello.c

它编译正常并按预期返回目录中的文件。

然后我尝试用动态库libhello.so编译driver.c文件

gcc driver.c libhello.so -o driver

它可以毫无怨言地编译,当我尝试运行可执行的“驱动程序”时会出现问题。我收到以下错误:

./driver: error while loading shared libraries: libhello.so: cannot open shared object file: No such file or directory

我很困惑,因为该文件实际上就在它正在编译的目录中。有人可以为我解释一下吗?

【问题讨论】:

  • 在使用 driver.c 编译时提供 ./libhello.so,因为它是用户定义的库。你把 libhello.so 复制到 /lib 目录了吗?
  • 我用 ./libhello.c 编译,它运行良好。谢谢!
  • "Icompiled with ./libhello.c" 这个当然不用libhello.so你已经建好了
  • @user3629249 说 libhello.so 完全没问题,它的作用与 -L 完全相同。 -lhello。

标签: c gcc shared-libraries


【解决方案1】:

实际上你并没有动态链接 libhello.so。你需要 -l 选项。 -l你好 您可以使用 ldd 驱动程序(您的 exec)检查依赖关系。

【讨论】:

    【解决方案2】:

    关于:

    gcc driver.c libhello.so -o driver 
    

    不正确。

    应该类似于:

    gcc driver.c -o driver -L. -lhello 
    

    当然,应该有一个头文件,其中包含库 libhello.so 的所有原型等

    该头文件通常命名为:hello.h,因此最终的 compile+link 语句将是:

    gcc driver.c -o driver -I. -L. -lhello <<< edited
    

    我写错了,最后一行,'-I'参数应该列出头文件的目录,而不是头文件名

    【讨论】:

    • @n.m.,要试一试,建议你把driver.clibhello.c的内容和libhello.c的头文件的内容贴出来,我可以试试。跨度>
    • 内容可以是任意的。这完全无关紧要。问题中包含重现问题所需的所有信息。
    • 其实内容是相关的。尤其是libhello.so 文件中函数原型的可用性。
    • 不,这不是真的。当图书馆不在那里时,图书馆的内部就无关紧要了。你没有试过这个。答案是错误且具有误导性的。
    • @n.m.,如果这个答案是错误的,那么请停止评论它并写下你自己的答案。
    猜你喜欢
    • 1970-01-01
    • 2013-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 2010-10-23
    • 1970-01-01
    相关资源
    最近更新 更多