在 autotoos/libtool 中正确处理插件(模块)

proper handling of plugins (modules) in autotoos/libtool

我有一个生成静态库L的项目。L的一些功能可以加载一些插件M(使用dlopen("libmmmm.so"):M是一个共享库(模块))。

测试L的module_load()功能的测试T由主测试T(L静态链接)和插件M组成,测试其在T+L中的加载。

测试是安装的一部分(定义了 testdir)。

下面是测试 T 目录中的 Makefile.am(同时构建 T 和 M):

#the test program linked with the static lib L:   
#(the tests are distributed as well, hence the test_* prefix)                                  
test_PROGRAMS = tttt                                       
tttt_SOURCES = tttt.c
tttt_LDADD = llll.la

#the module to be loaded by the T+L test:                                                     
lib_LTLIBRARIES = libmmmm.la                                        
libmmmm_la_SOURCES = mmmm.c                                 
libmmmm_la_LDFLAGS = $(AM_LDFLAGS) -module -shared  

问题在于可以找到模块的路径: 测试工作(即找到 libmmmm.so)进行检查。但是树外 (VPATH) 构建失败(未找到共享库)。

所以问题: 它应该如何工作? libtool 必须设置类似 LD_LIBRARY_PATH 的东西,我想,因为 dlopen() 永远不会理解 *.la 包装器...

那么它的作用是什么,我该如何解决这个问题,以便它始终有效,即进行检查,在树构建之外,进行 distcheck ... 将搜索路径硬编码到 .libs 目录中感觉不太便携:我们使用 autotools 因为我们针对许多不同的平台。

PS:我知道由于“-module”选项

,可以省略 M 的 "lib" 前缀

您可以使用 libltdl 来处理它,它确实理解 .la 文件,这将修复加载,但它不是 100% 相同 API。

否则,恐怕您将不得不编写自己的封装脚本来设置 LD_LIBRARY_PATH 在这种情况下。