welkin
dlopen 的搜索路径的问题
我的程序通过dlopen加载lib1.so, 而lib1.so本身也通过dlopen加载lib2.so。
但是如果lib1.so加载lib2.so的时候,如果没指定lib2.so的路径,就会报错,提示找不到lib2.so。
但是我如果先执行export LD_LIBRARY_PATH指定lib2.so的路径,那就提示成功。
但是我在程序里用setenv()设置了LD_LIBRARY_PATH,还是会提示lib2.so找不到,这是怎么回事阿?
我猜想,是不是setenv的问题。我试过在shell下设置LD_LIBRARY_PATH的时候,如果不带export,就会
报错。是不是setenv等同于不带export 的环境变量设置呢。
如果我想要export 的效果,代码该如何写呢?
welkin
我又试了一下,如果在程序里用dlopen 加载一个库的时候,如果不指定库的路径,仅仅是一个库名,然后在程序里通过
setenv()或者putenv()设置lLD_LIBRARY_PATH,还是不行,但是我如如果在运行程序之前,在命令行下,输入
export LD_LIBRARY_PATH=.....,的,这样就是可以了。
请教这是怎么回事?难道dlopen()函数不支持在程序里设定的环境变量?还是其他的原因,请不吝赐教。
代码如下:
[table=98%][tr][td][font=FixedSys][color=#000000][color=#0000cc]#[/color][color=#ff0000]include[/color] [color=#0000cc]<[/color]stdio[color=#0000cc].[/color]h[color=#0000cc]>[/color]
[color=#0000cc]#[/color][color=#ff0000]include[/color] [color=#0000cc]<[/color]stdlib[color=#0000cc].[/color]h[color=#0000cc]>[/color]
[color=#0000cc]#[/color][color=#ff0000]include[/color] [color=#0000cc]<[/color][color=#ff0000]string[/color][color=#0000cc].[/color]h[color=#0000cc]>[/color]
[color=#0000cc]#[/color][color=#ff0000]include[/color] [color=#0000cc]<[/color][color=#ff0000]errno[/color][color=#0000cc].[/color]h[color=#0000cc]>[/color]
[color=#0000cc]#[/color][color=#ff0000]include[/color] [color=#0000cc]<[/color]dlfcn[color=#0000cc].[/color]h[color=#0000cc]>[/color]
[color=#0000cc]#[/color][color=#ff0000]include[/color] [color=#0000cc]<[/color]libgen[color=#0000cc].[/color]h[color=#0000cc]>[/color]
[color=#0000cc]#[/color][color=#ff0000]include[/color] [color=#ff00ff]"so1.h"[/color]
[color=#0000cc]#[/color][color=#ff0000]include[/color] [color=#ff00ff]"so2.h"[/color]
[color=#0000ff]int[/color] main[color=#0000cc]([/color][color=#0000cc])[/color]
[color=#0000cc]{[/color]
[color=#0000ff]void[/color] [color=#0000cc]*[/color]handle[color=#0000cc];[/color]
[color=#0000ff]int[/color] [color=#0000cc]([/color][color=#0000cc]*[/color]ptr[color=#0000cc])[/color][color=#0000cc]([/color][color=#0000cc])[/color][color=#0000cc];[/color]
[color=#0000ff]char[/color] [color=#0000cc]*[/color]p[color=#0000cc];[/color]
[color=#0000ff]char[/color] buf[color=#0000cc][[/color]1024[color=#0000cc]][/color][color=#0000cc];[/color]
[color=#ff0000]printf[/color][color=#0000cc]([/color][color=#ff00ff]"[main]this is in main/n"[/color][color=#0000cc])[/color][color=#0000cc];[/color]
[color=#ff0000]memset[/color][color=#0000cc]([/color]buf[color=#0000cc],[/color] 0[color=#0000cc],[/color] [color=#0000ff]sizeof[/color][color=#0000cc]([/color]buf[color=#0000cc])[/color][color=#0000cc])[/color][color=#0000cc];[/color]
[color=#ff0000]sprintf[/color][color=#0000cc]([/color]buf[color=#0000cc],[/color] [color=#ff00ff]"LD_LIBRARY_PATH=%s"[/color][color=#0000cc],[/color] [color=#ff00ff]"/root/sybtest/so/"[/color][color=#0000cc])[/color][color=#0000cc];[/color]
putenv[color=#0000cc]([/color]buf[color=#0000cc])[/color][color=#0000cc];[/color]
[color=#ff0000]printf[/color][color=#0000cc]([/color][color=#ff00ff]"getenv:[%s]/n"[/color][color=#0000cc],[/color] [color=#ff0000]getenv[/color][color=#0000cc]([/color][color=#ff00ff]"LD_LIBRARY_PATH"[/color][color=#0000cc])[/color][color=#0000cc])[/color][color=#0000cc];[/color]
handle [color=#0000cc]=[/color] dlopen [color=#0000cc]([/color][color=#ff00ff]"libso1.so"[/color][color=#0000cc],[/color] RTLD_LAZY[color=#0000cc])[/color][color=#0000cc];[/color]
[color=#0000ff]if[/color] [color=#0000cc]([/color]handle [color=#0000cc]=[/color][color=#0000cc]=[/color] [color=#ff0000]NULL[/color][color=#0000cc])[/color]
[color=#0000cc]{[/color]
[color=#ff0000]printf[/color][color=#0000cc]([/color][color=#ff00ff]"[main]dlopen so2.so errror, %s./n"[/color][color=#0000cc],[/color] dlerror[color=#0000cc]([/color][color=#0000cc])[/color][color=#0000cc])[/color][color=#0000cc];[/color]
[color=#0000ff]return[/color] 0[color=#0000cc];[/color]
[color=#0000cc]}[/color]
ptr [color=#0000cc]=[/color] dlsym[color=#0000cc]([/color]handle[color=#0000cc],[/color] [color=#ff00ff]"os2_func"[/color][color=#0000cc])[/color][color=#0000cc];[/color]
[color=#0000ff]if[/color] [color=#0000cc]([/color][color=#0000cc]([/color]p [color=#0000cc]=[/color] dlerror[color=#0000cc]([/color][color=#0000cc])[/color][color=#0000cc])[/color] [color=#0000cc]![/color][color=#0000cc]=[/color] [color=#ff0000]NULL[/color][color=#0000cc])[/color]
[color=#0000cc]{[/color]
[color=#ff0000]printf[/color][color=#0000cc]([/color][color=#ff00ff]"[main]dlsym : %s ./n"[/color][color=#0000cc],[/color] p[color=#0000cc])[/color][color=#0000cc];[/color]
[color=#0000ff]return[/color] 0[color=#0000cc];[/color]
[color=#0000cc]}[/color]
[color=#0000cc]([/color][color=#0000cc]*[/color]ptr[color=#0000cc])[/color][color=#0000cc]([/color][color=#0000cc])[/color][color=#0000cc];[/color]
[color=#ff0000]printf[/color][color=#0000cc]([/color][color=#ff00ff]"[main] succ./n"[/color][color=#0000cc])[/color][color=#0000cc];[/color]
[color=#0000ff]return[/color] 0[color=#0000cc];[/color]
[color=#0000cc]}[/color]
[/color][/font][/td][/tr][/table]执行结果如下:
[main]dlopen so2.so errror, libso1.so: cannot open shared object file: No such file or directory