什么';这个makefile架构的目的是什么?

什么';这个makefile架构的目的是什么?,makefile,Makefile,我有一个程序,我正试图编译,让我们称之为p。p需要一个第三方库,L1。L1需要另一个库,L2。到目前为止,没有什么比这更奇怪的了 p的Makefile基本上只是设置一些变量,然后包括L1的Makefile L1的makefile进行了一系列的变量设置和填充(例如,包括要编译的文件列表),然后包括L2的makefile L2s makefile做了大量的工作,并且实际上制作了所有3个 我的问题是L2不想编译 然而,我的系统已经有了这两个库的二进制版本,但是我不能使用它们,因为L2 makefile

我有一个程序,我正试图编译,让我们称之为p。p需要一个第三方库,L1。L1需要另一个库,L2。到目前为止,没有什么比这更奇怪的了

p的Makefile基本上只是设置一些变量,然后包括L1的Makefile

L1的makefile进行了一系列的变量设置和填充(例如,包括要编译的文件列表),然后包括L2的makefile

L2s makefile做了大量的工作,并且实际上制作了所有3个

我的问题是L2不想编译

然而,我的系统已经有了这两个库的二进制版本,但是我不能使用它们,因为L2 makefile完成了所有的工作

此外,如果您使用动态库进行编译,它将在运行时查找要加载到编译目录中的库,而这些库不属于生产系统


我的问题是:他们为什么要这样设计呢?

可能是因为他们同时维护库和程序——对于他们来说,编译是有效的,通过这样做,他们可以保证两个库都是完全最新的(因此程序有最新的代码可供使用).

我想说,对我来说,闻起来像是一个自举过程……

在我看来,这就像是一种有机生长的东西:

  • 有人编写了L2的Makefile,使它变得非常复杂和强大。这个Makefile使用变量,比如对象列表,并从它们开始的任何地方(比如说,无)构建它们。
  • 有人(其他人?)不得不编写L1的Makefile,并决定通过构建L1的列表,然后将所有内容交给L2的Makefile,而不是尝试重新发明所有这些机制。
  • 你们店里有人不得不写P的Makefile,并把它放在L1的Makefile上。
    这种设计的问题(除了它很难解开)在于它只和链中最差的Makefile(可能是其他人制作的)一样好。如果L2没有编译,那么要么是某个Makefile包含了一个精致的Makefile并破坏了它,要么是环境中的某些东西改变了早期作者所依赖的东西。如果L2 Makefile正确地处理依赖项,那么您应该能够说服它使用库而不重建它们(并且您可以尝试单独使用L2来诊断问题)。如果没有,那么你就只能去探险了。

    它正在编译的东西是编译器吗?也许是一些自举过程?@JDehaan:正如我在下面评论的,不,这都是通信库。也许如果你提供更多细节,人们会提供更好的答案,只是一个想法。我不知道你为什么不直接链接一个构建的库并单独编译它。@威尔,我不确定添加的细节会有什么帮助。P是一个模拟传真调制解调器的程序,L1是SIP/H323通信库,L2是(我认为)更通用的(电话?)通信库。(P是T38MODE,L1是蛋白石,L2是ptlib,如果这有帮助的话)不是真的。L1和L2最初可能是同一个人,但P是一个完全不同的产品。但这使得实际使用非常困难。。。基本上,你可能是对的,但这很烦人。是的,如果你不能准确地构建库,那么很难使用它们。不,这不是编译编译器或操作系统或任何东西。这些都是通信库。这取决于你对“引导”的定义。如果它意味着“从头开始建设”,那么它是通信图书馆和程序并不重要;关键是通过构建组件库,然后构建程序来引导生成的程序。通常,引导用于编译器构建本身(见证GCC构建过程)或用于O/S入门,但它们并不是该术语的唯一含义。