[英]How to enable C++11/C++0x support in Eclipse CDT?
Eclipse 3.7.1 CDT 1.4.1 GCC 4.6.2
這是一段 C++11 代碼的示例:
auto text = std::unique_ptr<char[]>(new char[len]);
Eclipse 編輯器抱怨:
Function 'unique_ptr' could not be resolved
Makefile 編譯工作正常。 如何讓 Eclipse 停止抱怨此類錯誤?
我在 Eclipse 論壇中找到了 這篇文章,只是按照這些步驟操作,它對我有用。 我在帶有 Cygwin 設置的 Windows 上使用 Eclipse Indigo 20110615-0604。
-std=c++0x
(或對於較新的編譯器版本-std=c++11
放在最后......而不是 GCC C++ Compiler 我也有 Cygwin 編譯器__GXX_EXPERIMENTAL_CXX0X__
(確保附加並預先添加兩個下划線)到“名稱”並將“值”留空。現在 Eclipse FAQ 中也有對此的描述: Eclipse FAQ/C++11 Features 。
首先,在創建項目之前,配置Eclipse語法解析器:
Window
-> Preferences
-> C/C++
-> Build
-> Settings
-> Discovery
-> CDT GCC Build-in Compiler Settings
在標題為Command to get compiler specs
的文本框中追加-std=c++11
現在您可以創建項目,配置取決於您創建的項目類型:
對於創建為:文件 -> 新建 -> 項目 -> C/C++ -> C++ 項目的項目
右鍵單擊創建的項目並打開
Properties
-> C/C++ Build
-> Settings
-> Tool Settings
-> GCC C++ Compiler
-> Dialect
將-std=c++11
放入標題為other dialect flags
文本框中,或從Language standard
下拉列表中選擇ISO C++11
。
對於 CMake 項目
生成 eclipse 項目文件(在你的項目中)
mkdir build
cd build
cmake -G"Eclipse CDT4 - Unix Makefiles" -D CMAKE_BUILD_TYPE=Debug ..
然后將生成的目錄作為標准 eclipse 項目導入到 eclipse 中。 右鍵單擊項目並打開
Properties
-> C/C++ General
-> Preprocessor Include Paths, Marcos etc.
-> Providers
啟用CDT GCC Build-in Compiler Settings
並將其移至高於Contributed PathEntry Containers
(這很重要)
最后一個通用步驟
重新編譯,重新生成Project
-> C/C++ Index
並重新啟動 Eclipse。
2016 年更新:
從gcc 6 (更改)開始,默認的 C++ 方言是 C++14。 這意味着除非您明確需要比比方言更新或舊的方言,否則您不再需要對 eclipse 做任何事情。
這個社區維基部分包含了 Trismegistos 的答案;
1.在創建項目之前,配置Eclipse語法解析器:
Window -> Preferences -> C/C++ -> Build -> Settings -> Discovery -> CDT GCC Build-in Compiler Settings
在標題為 Command to get compiler specs 的文本框中 append -std=c++14
2. 創建項目,配置取決於您創建的項目類型:
對於創建為:文件 -> 新建 -> 項目 -> C/C++ -> C++ 項目的項目
右鍵單擊創建的項目並打開
屬性 -> C/C++ 構建 -> 設置 -> 工具設置 -> GCC C++ 編譯器 -> 方言
將-std=c++14
放入標題為其他方言標志的文本框中,或從語言標准下拉列表中選擇 ISO C++11。
對於最新版本:(目前為Juno 和 Kepler Luna ):
在較新版本的 Juno 下,設置位於Project properties -> C/C++ General -> Preprocessor Include Paths, Macros etc. -> tab Providers -> CDT GCC Builtin Compiler Settings ()
。
舊版本 2012/2013:
在 C/C++ Build(在項目設置中)下,找到Preprocessor Include Path 並轉到Providers Tab 。 取消選擇除 CDT GCC 內置編譯器設置之外的所有選項。 然后取消標記共享設置條目...。 將選項 -std=c++11 添加到名為 Command 的文本框以獲取編譯器規范。
轉到路徑和符號。 在符號下,單擊恢復默認值,然后應用。
筆記:
Eclipse 對點擊應用很挑剔,每次離開設置選項卡時都需要這樣做。
【自我推銷】:我在上面寫了自己的更詳細的說明。 http://scrupulousabstractions.tumblr.com/post/36441490955/eclipse-mingw-builds
感謝https://stackoverflow.com/a/13635080/1149664上的用戶Nobody
對於最新的 (Juno) eclipse cdt,以下對我__GXX_EXPERIMENTAL_CXX0X__
,無需在自己__GXX_EXPERIMENTAL_CXX0X__
聲明__GXX_EXPERIMENTAL_CXX0X__
。 這適用於 CDT 索引器並作為編譯器的參數:
“您的項目名稱”-> 右鍵單擊-> 屬性:
C/C++ General -> Preprocessor Include Paths, Macros etc. -> 切換到名為“Providers”的選項卡:
對於“配置”選擇“發布”(然后是“調試”)
關閉所有提供程序,然后選擇“CDT GCC 內置編譯器設置”
取消選中“在項目之間共享設置條目(全局提供程序)”
在“獲取編譯器規范的命令:”中添加不帶引號的“-std=c++11”(也可以使用引號)
點擊應用並關閉選項
重建索引
現在索引器應該正確解析所有與 c++11 相關的內容。
win7 x64,來自 sourceforge mingwbuilds 項目的帶有 cdt mingw-w64 gcc 4.7.2 的最新官方 Eclipse
我在 Eclipse Juno 上遇到了同樣的問題。 這些步驟解決了這個問題:
Project -> Properties -> C/C++ General -> Path and Symbols -> Tab [Symbols]
。對於 Eclipse CDT Kepler,對我來說擺脫std::thread
未解析符號的方法是:
轉到首選項-> C/C++-> 構建-> 設置
選擇發現選項卡
選擇 CDT GCC 內置編譯器設置 [共享]
將 -std=c++11 添加到“獲取編譯器規范的命令:”字段中,例如:
${COMMAND} -E -P -v -dD -std=c++11 ${INPUTS}
將-std=c++11
添加到項目Properties/C/C++ Build->Settings->Tool Settings->GCC C++ Compiler->Miscellaneous->Other
Flags 對 Kepler 來說還不夠,但是對於舊版本來說已經足夠了作為赫利俄斯。
我還不能發表評論,所以我正在寫我自己的答案:
它與__GXX_EXPERIMENTAL_CXX0X__
相關,並且對 Eclipse Juno 和 CDT 8.x 有效。
這個答案的某些部分已經包含在其他答案中,但我希望它是連貫的。
為了能夠使用 stdc++11 進行構建,必須為編譯器添加特定的標志。 您可以通過項目屬性來做到這一點。 要修改項目屬性RMB
和Project properties
或ALT + ENTER
。 然后C/C++ Build -> Settings -> Tool Settings -> GCC C++ Compiler -> Miscellaneous -> Other Flags。 將 -std=c++11 放在行尾,對於 GCC,它將類似於: -c -fmessage-length=0 -std=c++11
。 通過添加 -stdc++11 標志編譯器 (GCC) 將自行聲明__GXX_EXPERIMENTAL_CXX0X__
。
此時,您可以使用 C++11 的所有優點構建項目。
問題是 Eclipse 有它自己的解析器來檢查錯誤——這就是為什么你仍然在 Eclipse 編輯器中遇到所有令人討厭的錯誤,同時你可以在沒有任何錯誤的情況下構建和運行項目。 有一種方法可以通過為項目顯式聲明__GXX_EXPERIMENTAL_CXX0X__
標志來解決這個問題,可以這樣做(就像 Carsten Greiner 所說的那樣):C/C++ General -> Paths and Symbols -> Symbols -> GNU C++。 單擊“添加...”並在“名稱”中添加__GXX_EXPERIMENTAL_CXX0X__
(確保附加並預先添加兩個下划線)並將“值”留空。 現在是我想在第一個答案的評論中涵蓋的額外部分,轉到:C/C++ General -> Preprocessor Include Path Macros etc. -> Providers,然后選擇CDT Managed Build Setting Entries
然后單擊 APPLY 並返回Entries 選項卡,在 GNU C++ 下,現在應該有 CDT Managed Build Setting Entries 檢查內部是否定義了__GXX_EXPERIMENTAL_CXX0X__
如果是 -> APPLY 並重建索引此時你應該沒問題。
我也有幾個問題(Ubuntu 13.04 64 位,g++-4.8,eclipse Juno 3.8.1,CDT 6.0.0)。 上面提到了很多東西,很抱歉重復這些,但另外我在使用時遇到了問題
std::thread
作為 c++11 的一部分(為鏈接器添加 -pthread 可以解決該問題)。 無論如何,最后這些設置工作正常:
項目 -> 屬性 -> C/C++ 構建 -> 設置 -> 雜項。 添加
-std=c++11
GCC 和 G++ 編譯器的標志。 單擊應用。
對於鏈接器,相同的窗口,雜項,鏈接器標志,添加了
-pthread
旗幟。 共享庫設置,共享對象名稱,添加
-Wl,--no-as-needed
國旗也是。 單擊應用。
C/C++ General -> Paths and symbols -> Symbols TAB,選擇GNU C++,添加
__GXX_EXPERIMENTAL_CXX0X__
(沒有價值)
旗幟。 單擊應用。
C/C++ General -> Preprocessor Include paths.. -> Providers 選項卡:檢查
CDT GCC 內置編譯器設置
對於“獲取編譯器規范的命令”,添加
-std=c++11
旗幟。 取消選中共享。 單擊應用。
CDT 管理構建設置條目,也檢查這個。 取消選中另外兩個。 單擊應用。
返回條目選項卡,GNU C++ CDT 管理構建設置條目,您現在應該看到您添加的
__GXX_EXPERIMENTAL_CXX0X__
入口。
就是這樣。 編碼時,鍵入
std::
例如,現在可以自動完成線程類,構建應該可以正常工作,並且應該沒有
std::system_error'what(): Enable multithreading to use std::thread: Operation not permitted
在運行時。
我不知道是不是只有我,排名最高的解決方案對我不起作用,我的 eclipse 版本只是在 Ubuntu 中使用 sudo apt-get install eclipse 安裝的普通 eclipse 平台但我找到了一個采用方法的解決方案從排名最高的解決方案和第二個解決方案中,我為使其工作所做的描述如下(請注意,為簡單起見,忽略了其他步驟,例如創建 C++ 項目等)
創建 C++ 項目后
(1) C/C++ General -> Paths and Symbols -> Symbols -> GNU C++。 單擊“添加...”並將GXX_EXPERIMENTAL_CXX0X (確保附加和前置兩個下划線)粘貼到“名稱”中,並將“值”留空。
(2) 在 C/C++ Build 下(在項目設置中),找到 Preprocessor Include Path 並轉到 Providers 選項卡。 取消選擇除 CDT GCC 內置編譯器設置之外的所有選項。 然后取消標記共享設置條目...。 將選項 -std=c++11 添加到名為 Command 的文本框以獲取編譯器規范
執行完以上2和2步驟后,就可以了,eclipse可以解析unique_ptr,不知道為什么這個解決方案有效,希望對大家有幫助。
即使您在文件中包含了 C++11 內存標頭,Eclipse C/C++ 也無法識別符號std::unique_ptr
。
假設您使用的是 GNU C++ 編譯器,這就是我要修復的內容:
Project -> Properties -> C/C++ General -> Preprocessor Include Paths -> GNU C++ -> CDT User Setting Entries
單擊“添加...”按鈕
從下拉菜單中選擇“預處理器宏”
Name: __cplusplus Value: 201103L
點擊 Apply,然后 OK 回到你的項目
然后重建你的 C++ 索引:項目 -> C/C++ 索引 -> 重建
對於我在Eclipse Neon 上,我按照上面的Trismegistos回答進行了操作,但我還添加了一個額外的步驟:
點擊應用並確定。
干杯,
伙計。
hack 和更清潔的版本都不適用於 Indigo。 hack 被忽略,並且缺少所需的配置選項。 沒有明顯的原因,構建在不工作並且沒有提供任何有用的原因后開始工作。 至少從命令行,我得到了可重復的結果。
要在 Eclipse Luna 中獲得對 C++14 的支持,您可以執行以下步驟:
C++ General -> Preprocessor Include -> Providers -> CDT Cross GCC Built-in Compiler Settings
,添加“-std=c++14”C++ Build -> Settings -> Cross G++ Compiler -> Miscellaneous
,添加“-std=c++14”重新索引您的項目並最終重新啟動 Eclipse。 它應該按預期工作。
我在 Mac 上以這種方式解決了它。 我使用 Homebrew 安裝了最新版本的 gcc/g++。 它們位於 /usr/local/bin 中,包含在 /usr/local/include 中。
我 CD 進入 /usr/local/bin 並創建了一個從 g++@7whatever 到 g++ 的符號鏈接,因為 @bit 很煩人。
然后我轉到 MyProject -> Properties -> C/C++ Build -> Settings -> GCC C++ Compiler 並將命令從“g++”更改為“/usr/local/bin/g++”。 如果您決定不創建符號鏈接,則可以更具體。
對鏈接器做同樣的事情。
應用和應用並關閉。 讓它重建索引。 有一段時間,它顯示了令人生畏的錯誤數量,但我認為那是在構建索引時。 當我找出錯誤時,它們都消失了,沒有采取進一步的行動。
我認為無需驗證您是否也可以進入 Eclipse -> Properties -> C/C++ -> Core Build Toolchains 並使用不同路徑編輯它們,但我不確定那會做什么。
對於使用std::optional
和std::swap
的混合 C 和 C++ 項目,我在使用 Eclipse C++ 2019-03 時遇到了類似的問題。 對我有用的是這個。
在項目Properties->C/C++ Build->Settings->Tool Settings->Cross G++ Compiler
,從Miscellaneous
刪除-std=gnu++17
並將其放在Dialect->Other Dialect Flags
。
在使用交叉編譯器時,我經常會得到同事精心制作的高級自定義構建系統。 我使用“Makefile Project with Existing code”,所以大多數其他答案都不適用。
在項目開始時,我必須在“Makefile Project with Existing Code”向導中指定我正在使用交叉編譯器。 令人討厭的是,在過去 10 年左右的時間里,該向導上的交叉編譯器按鈕沒有提示交叉編譯器的位置。 因此,在修復 C++ 問題和交叉編譯器問題的步驟中,我必須轉到上面@ravwojdyla 之類的答案中提到的提供程序選項卡,但我必須選擇的提供程序是交叉編譯器提供程序。 然后在命令框中輸入編譯器的完整路徑,並為我想要支持的 C++ 標准添加 -std=gnu++11。 這和可以預期的一樣有效。
您可以對現有項目執行此操作。 您可能唯一需要做的就是重新運行索引器。
我從來不需要添加實驗標志或覆蓋 __cplusplus 的定義。 唯一的問題是,如果我有大量的現代 C 代碼,我無處放置特定於 C 的標准選項。
當事情進展非常糟糕時,使用 Indexer 子菜單中的該命令獲取解析器日志可以提供非常有用的信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.