Makefile 指定在共享对象链接期间包含整个存档

Makefile 指定在共享对象链接期间包含整个存档,makefile,autoconf,automake,Makefile,Autoconf,Automake,我有一个共享对象库(C++中的python扩展),其中包括来自共享代码库的其他几个存档,这些存档被包装在-Wl,整个存档arhive1.a archive2.a-Wl,在我们以前自制的makefiles版本中,没有完整的存档。每个归档文件都包含在自己的子目录中,并作为python扩展最终目标的一部分构建。我正在使用autoconf和automake移植我们的构建环境 在与python扩展相关的Makefile.am中,我有以下内容(去掉了无关的内容): 所有这些东西都出现在命令行上,但没有正确打

我有一个共享对象库(C++中的python扩展),其中包括来自共享代码库的其他几个存档,这些存档被包装在
-Wl,整个存档arhive1.a archive2.a-Wl,在我们以前自制的
makefile
s版本中,没有完整的存档。每个归档文件都包含在自己的子目录中,并作为python扩展最终目标的一部分构建。我正在使用autoconf和automake移植我们的构建环境

在与python扩展相关的
Makefile.am
中,我有以下内容(去掉了无关的内容):

所有这些东西都出现在命令行上,但没有正确打包,因为当我导入
pyextension
模块时,它所查找的归档文件中会出现未定义的符号错误。最初,我对
pyextension\u LDFLAGS
有类似的内容:

pyextension_la_LDFLAGS = -Wl,whole-archive $(ARCHIVE1_PATH)/archive1.a $(ARCHIVE2_PATH)/archive2.a -Wl,no-whole-archive -lz -lrt -module 
然而,令我惊讶的是,当make处理最终的
Makefile
时,在运行
/configure
选项
-Wl、whole archive
-Wl之后,命令行中不会出现完整的归档文件,但是之间没有任何内容(?)和其他地方列出的归档文件。因此,我想我应该尝试使用
pyextension\u la_LIBADD
的方法来处理归档文件,这样魔法就会奏效


我不知道接下来该怎么办。顺便说一句,这些其他存档库将与其他库一起安装,作为我们部署的一部分,但在构建过程中,它们显然尚未安装。因此,任何关于如何实现这一点的建议都是非常值得赞赏的。我仍然是一个汽车制造商和autoconf新手。

你可能会得到同样的帮助:


用逗号将多个参数指定为一个代码> Wl < /COD>选项将使AutoAKE认为它们是单个单元,不会移动它们。缺点是Automake无法确定这些对象文件是库的依赖项,因此您可能还必须指定

\u依赖项

您不应该在
LDFLAGS
:而不是
-lz-lrt
等中放置任何控制特定库链接方式的库或选项
LDFLAGS
仅适用于控制整个链接器的选项。属于
LDFLAGS
的选项的典型示例是
-L
选项。所有
-l
选项、所有取决于标志顺序的选项等都属于
LIBADD
。另外,我假设您需要
-Wl,--整个存档
,而不是
-Wl,整个存档
,对吗?或者前端是否为您添加了
--
?请记住,链接器对命令行上的选项排序非常敏感。如果你为你的共享库发布一个链接行的剪切/粘贴,那会很有帮助,这样我们就可以看到它了。doh,我知道,但是,正如我所说,我是个新手,忘记了。我已更改为这个
pyextension\u la_LIBADD=-lz…
。我试图在那里添加我的
-Wl,--whole archive
,但从libtool收到了“不好意思”的消息,像这样的选项应该放在
\u LDFLAGS
中。所以,我把它移回到了那里,再一次,我在
-Wl,--whole archive-Wl,--no-whole archive
之间看不到任何东西,即使我把它们放在
Makefile中。你确定消息来自libtool吗?在任何情况下,这些标志都不得出现在
LDFLAGS
中。时期不管libtool(或automake)怎么说,把它们放在那里是行不通的。它们必须出现在
LIBADD
中。工具只能把它吸起来,所以我似乎陷入了第二十二条军规的僵局。LDFLAGS不是应该列出我的归档文件的位置,但是这些归档文件必须在
--整个归档文件
--无整个归档文件
选项之间列出。然而,automake有一个解释,说我不应该在LIBADD中使用
-Wl,
。那么,我到底应该如何让它工作呢?
pyextension_la_LDFLAGS = -Wl,whole-archive $(ARCHIVE1_PATH)/archive1.a $(ARCHIVE2_PATH)/archive2.a -Wl,no-whole-archive -lz -lrt -module 
-Wl,--whole-archive,$(ARCHIVE1_PATH)/archive1.a,$(ARCHIVE2_PATH)/archive2.a,--no-whole-archive