2009-06-22 40 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