某些應用程序包含駐留在/ usr/libexec中的主應用程序運行的腳本。但是,autoconf腳本可以通過將--libexecdir
傳遞給配置腳本來更改該目錄。從編譯器將目錄傳遞給C++應用程序
例如,在運行./configure
中的git
源代碼時,我可以將--libexecdir
設置爲我想要的任何目錄,程序仍然可以工作。
我需要添加到C++才能使此功能有效嗎?換句話說,我怎樣才能將一個由配置腳本設置的目錄名稱編譯到程序中?
某些應用程序包含駐留在/ usr/libexec中的主應用程序運行的腳本。但是,autoconf腳本可以通過將--libexecdir
傳遞給配置腳本來更改該目錄。從編譯器將目錄傳遞給C++應用程序
例如,在運行./configure
中的git
源代碼時,我可以將--libexecdir
設置爲我想要的任何目錄,程序仍然可以工作。
我需要添加到C++才能使此功能有效嗎?換句話說,我怎樣才能將一個由配置腳本設置的目錄名稱編譯到程序中?
您需要將@[email protected]
替代變量(例如用於Makefile.in
)的值暴露給您的C++代碼。要做到這一點,最簡單,最可靠的方法是用對象文件編譯器命令行上一個-D
交換機需要知道:
foo.o: CPPFLAGS += -DLIBEXECDIR='"$(libexecdir)"'
在foo.cc
,LIBEXECDIR
屆時將預處理宏擴展到字符串常量那有你需要的路徑。但有兩點需要注意:上面的Makefile代碼片段使用了GNU make功能,target-specific variables。它在其他Make實現中不起作用。另外,我並沒有在$(libexecdir)
的擴展中引用任何字符。完全防禦報價會是這個樣子:
foo.o: CPPFLAGS += \
-DLIBEXECDIR='"$(subst ",\",$(subst ','\'',$(subst \,\\,$(libexecdir))))"'
你一定會需要至少最裏面的$(subst ...)
構建,如果你希望能夠使用Windows路徑名,用斜槓走錯了路。人們通常不會把「或」的路徑名,所以我可能不會與外側的兩個打擾,直到有人抱怨。
同樣的技術將對於是不是也是任何@[email protected]
替代變量工作一個AC_DEFINE
。
你可能會認爲你可以使用AC_DEFINE_UNQUOTED
以某種方式獲得的$(libexecdir)
價值爲config.h
,從而避免這一切的命令行各地搞混。不幸的是,Autoconf的不完全計算的值,其@*[email protected]
個換人在配置時:
# near the top of the generated 'configure':
exec_prefix=NONE
libexecdir='${exec_prefix}/libexec'
# much, much later -- as part of AC_OUTPUT:
test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
因此,如果你有AC_DEFINE_UNQUOTED
做明顯的事情,你會得到類似
#define LIBEXECDIR "${exec_prefix}/libexec"
在你的config.h
。所以這是行不通的,我看不到一個好的方法來使它工作。
謝謝你的回答!這很清楚! –