在 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
在这种情况下。
我有一个生成静态库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
在这种情况下。