C 必须链接到从属库';家属;为什么?

C 必须链接到从属库';家属;为什么?,c,shared-libraries,C,Shared Libraries,我有一个应用程序——我们称之为“p”——它使用自定义SO:A.SO、B.SO和C.SO A.so库使用另一个自定义库-D.so-以及SSL和数学库。 “P”应用程序不调用任何SSL或数学例程 在macOS上(使用叮当),我可以用-lA-lB-lC构建p,一切都很好。 我正在使用GCC将所有内容迁移到Linux(Debian)。 现在,当我创建P时,我必须-lA-lB-lC-lD-lm-lssl 我做错了什么? 我使用的是简单的makefile-没有自动配置,没有cmake,等等。 当我构建库时,

我有一个应用程序——我们称之为“p”——它使用自定义SO:A.SO、B.SO和C.SO A.so库使用另一个自定义库-D.so-以及SSL和数学库。 “P”应用程序不调用任何SSL或数学例程

在macOS上(使用叮当),我可以用
-lA-lB-lC
构建p,一切都很好。 我正在使用GCC将所有内容迁移到Linux(Debian)。 现在,当我创建P时,我必须
-lA-lB-lC-lD-lm-lssl

我做错了什么? 我使用的是简单的makefile-没有自动配置,没有cmake,等等。
当我构建库时,这可能是“安装名称工具”与“chrpath”的问题吗?

这是因为以下两个因素的组合:

  • 在macOS上,编译器自动链接的标准C库(
    libSystem.dylib
    )已经包含了比Linux多得多的功能。它可能包括程序所需的一些(或全部)功能。例如,您可以从中看到,
    libSystem
    已经包含了数学库(它在Linux上是一个单独的文件,需要与
    -lm
    链接)

  • 您正在链接的共享库是为macOS编译的,其中已经嵌入了其他函数,因此这些库不需要链接到其他共享库。一个库依赖于不同操作系统上的其他库并不少见


  • 另一方面,在Linux上,标准C库被分为不同的文件:
    -lc
    由编译器自动链接,但数学库(
    -lm
    )和其他部分(
    -ldl
    -lpthread
    等)没有,因此需要手动链接。

    解决了这个问题。事实证明,
    clang
    ——无论开发平台如何——在链接时,参数和选项的顺序要宽容得多。使用
    clang
    ,您几乎可以按照您想要的顺序放置
    -I
    -L
    -L
    、其他选项和对象文件。gcc的情况并非如此;这要特别得多<代码>叮当声让我很懒。

    谢谢你的回复。理解。。。但举个简单的例子。。。如果我有一个程序P,它使用我的共享库a,而我的共享库a使用pthreads,那么只需要将a链接到pthreads。当我构建P时,我应该只需要将它与A链接。