2010-09-17 74 views
16

我正在嘗試使用cpputest構建一個簡單的單元測試可執行文件。我已經將cpputest框架構建到一個靜態庫中,並且現在正試圖將它鏈接到一個可執行文件中。但是,由於相關的代碼,我被綁定到相當複雜的Makefile設置中。未定義的運營商新引用

這是我的命令行:

/usr/bin/qcc -V4.2.4,gcc_ntoarmle_acpp-ne -lang-c++ -O2 -g -g -o Application/UnitTests/Tests/symbols/UnitTestExe -Wl,--start-group Application/UnitTests/Tests/../.objs/main.o Application/UnitTests/lib/libcpputest.a -Wl,--end-group -lm 

我得到許多錯誤像下面這樣:

Application/UnitTests/lib/libcpputest.a(CommandLineTestRunner.o): In function `CommandLineTestRunner::parseArguments(TestPlugin*)': 
    Application/UnitTests/cpputest/src/CppUTest/.objs/../CommandLineTestRunner.cpp:114: undefined reference to `operator new(unsigned int, char const*, int)' 

我想不出什麼導致這一點。我不用C++免費獲得運算符新的版本嗎?

+0

根據這些信息確實很難提供幫助。嘗試*減少重現問題所需的條件。上面的命令行太複雜了,即使我們假設代碼很簡單,並且不執行重新定義'operator new'等操作。 – 2010-09-17 13:43:19

+0

第一個錯誤是否報告了操作員新錯誤?如果不是,報告的第一個錯誤是什麼? – 2010-09-17 13:50:28

+0

是的,報告的唯一錯誤是操作員新錯誤。顯示的那個是第一個。 – mbyrne215 2010-09-17 13:50:57

回答

6

有你的問題,從工作的信息非常少,但它看起來像一些代碼使用某種形式的放置新,雖然特殊operator new宣佈(編譯器發現它和編譯代碼使用它),接頭找不到它的定義

+0

我不確定要添加哪些其他信息。代碼非常簡單;它並沒有重新定義'新',所以我不明白爲什麼鏈接器無法從標準庫中找到它。 – mbyrne215 2010-09-17 14:02:02

+1

@ mbyrne215:你可以添加最簡單的代碼來重現這一點。該錯誤消息清楚地提到了一個'operator new(unsigned int,char const *,int)'(從'CommandLineTestRunner :: parseArguments(TestPlugin *)'調用),顯然不是該運算符的標準版本。 – sbi 2010-09-17 14:07:10

+2

你是對的;我很想找到爲什麼標準庫不工作,我沒有仔細查看第三方庫。這是在暗中重新定義新的。我刪除了這部分,一切都很好。謝謝。 – mbyrne215 2010-09-17 14:21:50

46

您可能需要鏈接到C++支持運行時庫。這在調用g ++時會自動發生。在linux上,這是通過向鏈接器添加-lstdC++標誌來實現的。你必須弄清楚如何在你的平臺上做同樣的事情。

+0

+1,謝謝.. – Oli 2012-12-14 22:50:07

+0

這是解決了我的問題的答案,我的 – yota 2017-10-13 08:58:13

4

您需要從頭開始重建代碼,包括庫。我得到這個錯誤是因爲我無意中將在另一臺機器上編譯的目標文件(與源文件的其餘部分)複製到我的機器上。很可能這會干擾鏈接步驟,因爲現在有兩種類型的目標文件,本機文件(用於修改的源文件)和非本機文件(所有其他文件)。我在這裏猜測,但運營商的'新'在不同的架構上意味着稍微不同的事情,這就是爲什麼你得到這個錯誤。

p.s.我知道這對於一個有用的答案來說太晚了,但我仍然發佈這個記錄。

+0

在我的情況下,有一些來自我的前任的.o文件,在make clean之後留下,一切都像魅力一樣工作 – aldr 2016-04-15 21:15:26

0

也許你打電話給gcc,C編譯器代替g++,這是C++編譯器。

0

對於QNX 6.5.0,我已指定標記-lang-c++qccgcc)以避免該錯誤。