2009-06-22 67 views
2

我需要对现有的长C源代码进行一些更改。有一个顶级Makefile,它定义了各种编译器选项,例如链接器使用的库的目录位置。从Makefile导入变量到C程序中

喜欢的东西:

LD_OPTIONS = $(PATH_TO_MYLIB1) $(PATH_TO_MYLIB2) 

现在,我想用dlsym()dlopen()使用这些库,而不是明确地联系起来的。为此,我需要库路径。

dlopen(path_to_lib , RTLD_NOW) ; 

如何从Makefile中使用PATH_TO_LIB变量并在我的程序中使用它?我想过使用诸如“echosystem()”之类的东西。但是,我的期望是有更好的解决方案。 :-)

回答

9

在你的makefile,你可以写

CFLAGS += -DPATH_TO_LIB="somepath/somelib" 

所以PATH_TO_LIB成为预处理器宏,你可以在你的源使用像

dlopen(PATH_TO_LIB, RTLD_NOW); 
4

我不太看到你的变化点如果你的路径是硬编码的,但我离题了。你可以做这样的事情:

在生成文件:

CFLAGS = -DMYLIB_1=$(PATH_TO_MYLIB1) -DMYLIB_2=$(PATH_TO_MYLIB2) 

然后在您的烃源:

dlopen(MYLIB_1, RTLD_NOW); 
2

财产以后这样的吧?

在你的代码

#ifndef PATH_TO_LIB 
#error Path to ImportantLib missing 
#endif ... 

和编译命令可能看起来像 :

cc -DPATH_TO_LIB=\"${PATH_TO_LIB}\" 
+0

如果你打算做这样的事情,它可能会更好做#warning后或在#ifndef块内部#error,而不是仅仅把它赋值给一些在运行时会中断的任意值(可能会晚得多,因为我们永远不知道这个dlopen()什么时候会被调用) – 2009-06-22 08:26:33