C 必须链接到从属库';家属;为什么?
我有一个应用程序——我们称之为“p”——它使用自定义SO:A.SO、B.SO和C.SO A.so库使用另一个自定义库-D.so-以及SSL和数学库。 “P”应用程序不调用任何SSL或数学例程 在macOS上(使用叮当),我可以用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,等等。 当我构建库时,
-lA-lB-lC
构建p,一切都很好。
我正在使用GCC将所有内容迁移到Linux(Debian)。
现在,当我创建P时,我必须-lA-lB-lC-lD-lm-lssl
我做错了什么?
我使用的是简单的makefile-没有自动配置,没有cmake,等等。
当我构建库时,这可能是“安装名称工具”与“chrpath”的问题吗?这是因为以下两个因素的组合:
libSystem.dylib
)已经包含了比Linux多得多的功能。它可能包括程序所需的一些(或全部)功能。例如,您可以从中看到,libSystem
已经包含了数学库(它在Linux上是一个单独的文件,需要与-lm
链接)
另一方面,在Linux上,标准C库被分为不同的文件:
-lc
由编译器自动链接,但数学库(-lm
)和其他部分(-ldl
,-lpthread
等)没有,因此需要手动链接。解决了这个问题。事实证明,clang
——无论开发平台如何——在链接时,参数和选项的顺序要宽容得多。使用clang
,您几乎可以按照您想要的顺序放置-I
、-L
、-L
、其他选项和对象文件。gcc的情况并非如此;这要特别得多<代码>叮当声让我很懒。谢谢你的回复。理解。。。但举个简单的例子。。。如果我有一个程序P,它使用我的共享库a,而我的共享库a使用pthreads,那么只需要将a链接到pthreads。当我构建P时,我应该只需要将它与A链接。