我和其他人遇到了同样的问题:
- 在一个Automake项目中,我有一个由libtool生成的
*.la
文件(例如module.la
), - 但我需要它的
*.so
文件以便在dlopen()
中使用它(例如module.so
)。
但是: 项目被配置和构建为使用--disable-shared
,以确保创建的主二进制文件是一个巨大的静态链接程序,例如main.x
(易于部署和调试)。因此,不会创建*.so
文件。
程序main.x
是一个类似框架的大型应用程序,能够通过dlopen()
加载扩展模块,尽管它被静态链接。
手动构建module.so
时可以正常工作。但是,在Makefile.am
中实现这一点似乎对我来说是不可能的。是的,我可以编写lib_LTLIBRARIES
,但是在我的标准--disable-shared
下,我得不到*.so
文件。
lib_LTLIBRARIES = module.la
module_so_SOURCES = module.cpp
创建了文件module.la
,但是dlopen()
拒绝加载它(当然)。
我尝试手动将规则放入Makefile.am
中进行构建,这样就可以了:
# Makefile.am (yes, .am)
all: mm_cpp_logger.so
SUFFIXES = .so
%.so: %.cpp
$(CXX) $(CXXFLAGS) -fPIC -fpic -c -I $(top_srcdir)/include -o $@ $<
%.so: %.o
$(CXX) $(LDFLAGS) -shared -fPIC -fpic -o $@ $<
但这只能是一个解决方法。我没有获得所有的很好的自动功能,比如依赖检查和安装。
在构建module.so
的同时如何仍然使用--disable-shared
(或以同样的效果)在Makefile.am
中构建主程序?
- 我能否使用特殊的automake规则将
*.la
文件后处理为*.so
文件? - 我能否调整
lib_LTLIBRARIES
过程以在任何情况下创建*.so
文件?
-static-libtool-libs
取代了-all-static
,同时也在我的其他“方便”库(不是我们正在讨论的那个)上使用了这个方法——因为当我使用-all-static
时,dl_blahblah()
的东西会导致程序崩溃(我很确定它是罪魁祸首)。无论如何:不幸的是,我仍然可以从.libs/
中获取到.libs/mm_cpp_logger.so
——当我为模块编写测试时,我发现这有点尴尬。从.libs/
中加载似乎...不太对劲。它总是出现在那里,不管我做什么,这正常吗? - towi.libs
之外获取可用的库。 - umläute