我正在尝试从使用 waf 构建系统编译的程序中调用 dlsym 函数,但无法使用 wscript 链接 libdl。这似乎是一项非常简单的任务,但我已经尝试了一百万种不同的东西,但一无所获。
编辑:如果有一种通用方法可以在每个构建命令的末尾添加标志,那就更好了。我试过设置 CXXFLAGS 和其他环境变量,但它们似乎没有改变任何东西......
我正在尝试从使用 waf 构建系统编译的程序中调用 dlsym 函数,但无法使用 wscript 链接 libdl。这似乎是一项非常简单的任务,但我已经尝试了一百万种不同的东西,但一无所获。
编辑:如果有一种通用方法可以在每个构建命令的末尾添加标志,那就更好了。我试过设置 CXXFLAGS 和其他环境变量,但它们似乎没有改变任何东西......
如果您尝试直接传递use=dl
给构建命令,waf 将在配置环境字典中查找“uselib 变量”以告诉它如何处理它。
用于构建简单test.c
程序的最小 wscriptdl
可能如下所示:
def options(opt):
opt.load('compiler_c')
def configure(conf):
conf.load('compiler_c')
# Make sure the we're able to link against dl
conf.check(lib='dl')
# If someone passes LIB_DL, to the build command, link against system library dl
conf.env.LIB_DL = 'dl'
def build(bld):
bld(source='test.c',
target='test_program',
features='c cprogram',
# Waf will look in LIB_DL, LIBPATH_DL, CXXFLAGS_DL, etc. for how to handle this
use='DL')
Waf 还提供了一种简写方式来避免显式设置LIB_DL
:
def configure(conf):
conf.load('compiler_c')
conf.check(lib='dl', uselib_store='DL')
这在此处有所记录
为了完整起见,这是test.c
我用来测试的文件:
#include <dlfcn.h>
int main(int argc, char** argv)
{
dlopen("some/file", RTLD_LAZY);
return 0;
}