我們的構建系統發生了某種變化,優化的構建不再將-DNDEBUG添加到編譯行中。我搜索了我們的makefiles,但沒有找到它。-DNDEBUG通常來自哪裏?
所以問題是,-DNDEBUG起源於大多數人,它可能會如何改變?在我們確實有-DNDEBUG之前,我不認爲這已從我們的任何makefile中移除。
謝謝。
- 威廉
我們的構建系統發生了某種變化,優化的構建不再將-DNDEBUG添加到編譯行中。我搜索了我們的makefiles,但沒有找到它。-DNDEBUG通常來自哪裏?
所以問題是,-DNDEBUG起源於大多數人,它可能會如何改變?在我們確實有-DNDEBUG之前,我不認爲這已從我們的任何makefile中移除。
謝謝。
- 威廉
由於編譯器無法自行決定何時添加NDEBUG定義以及何時不定位,該標誌始終由makefile或項目文件(取決於您的構建系統)進行設置。
根據我的經驗,-DNDEBUG已手動通過,即生成文件已經寫在這樣一種方式,建立在釋放模式時,標誌傳遞。
因爲您沒有指定您正在使用的構建系統,所以很難回答這個問題。如果您使用的是autoconf,那麼用戶需要手動將-DNDEBUG放入CPPFLAGS中(或者您可能是通過CONFIG _已更改的SITE文件進行設置),或者configure.ac可能會設置一個自定義變量設置NDEBUG或configure.ac可能會調用AC _ HEADER _ ASSERT,在這種情況下,將--disable-assert添加到configure調用將在config.h中定義NDEBUG。有很多方法可以發生。
如果我需要在'configure.ac'中做'AC_DEFINE(NDEBUG,[],[])'和'CPPFLAGS =「$ CPPFLAGS -DNDEBUG」'之間的選擇,我該怎麼做?在config.h中使用#define NDEBUG會有缺點嗎?如果我都這樣做,我會收到很多我想避免的「NDEBUG重複定義」警告。 – 2017-04-16 19:49:12
如果您要維護autoconf元數據文件,則應該使用AC_HEADER_ASSERT,並讓用戶在配置時指定--disable-assert。用戶有責任確保-DNDEBUG被傳遞給編譯器,如果他們願意的話。默認定義NDEBUG是不合適的;這不是包維護者的特權。 – 2017-04-16 22:07:39
如果缺省情況下未啓用-DNDEBUG,但是通過選項 - 啓用釋放,該怎麼辦?這是否合適?在那種情況下,我將如何激活-DNDEBUG? – 2017-04-17 07:16:27
如果您使用GNU構建工具,即autoconf和朋友,可能需要檢查configure或configure.ac – Anycorn 2009-12-10 04:48:08
我沒有使用配置,只是GNU makefiles。 – WilliamKF 2009-12-10 15:06:59