【发布时间】:2012-12-06 14:24:39
【问题描述】:
我和others有同样的问题:
- 我有一个由 libtool 在 Automake 项目中生成的
*.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 $@ $<
但这只能是一种解决方法。我没有得到所有好的自动功能,比如依赖检查和安装。
如何在Makefile.am-way 中使用--disable-shared(或具有相同效果)构建主程序的同时构建module.so?
- 我可以使用特殊的自动生成规则将
*.la文件后处理为*.so文件吗? - 无论如何我可以调整
lib_LTLIBRARIES进程来创建*.so文件吗?
【问题讨论】:
标签: shared-libraries automake libtool