2008-11-05 91 views
13

我有一些舊的C代碼,我想結合一些C++代碼。iostream鏈接器錯誤

曾經有過的C代碼如下包括:

#include <windows.h> 
#include <stdio.h> 
#include <string.h> 
#include "mysql.h" 

現在我要把它用C++使用的iostream這樣的:

#include <windows.h> 
#include <stdio.h> 
#include <string> 
#include <iostream> 
#include "mysql.h" 

但我不斷收到以下鏈接器錯誤,當我編譯時:

[鏈接器錯誤]未定義的引用'std :: string :: size()const'

[連接子錯誤]未定義參考`的std :: string ::運算符[](無符號整型)const的」

[連接子錯誤]未定義參考`的std :: string ::運算符[](無符號INT)常量 '

[連接子錯誤]未定義參考`的std :: string ::運算符[](無符號整型)const的'

[連接子錯誤]未定義參考`的std ::的ios_base ::初始化:: Init()'

[鏈接器錯誤]未定義對`std :: ios_base :: Init ::〜Init()'的引用'

LD返回1退出狀態

我該如何解決這個問題?

編輯:我的編譯器是開發-C++ 4.9.9.2

回答

26

的C string.h標題和C++ string標題不可互換。

,總的來說,你的問題是,該文件得到正確的編譯,但是錯誤的運行時庫是獲得鏈接。

開發-C++使用GCC。 GCC可以根據文件擴展名正確地確定文件中的語言,但是除非您特別要求它((在命令行使用-lstdC++)),否則不會鏈接正確的運行時庫。將GCC稱爲「g ++」(或者,在您的情況下,「mingwin32-g ++」)也將獲得正確的語言,並將鏈接所需的庫。

3

你需要對你的C++運行時鏈接。這取決於你的平臺和編譯器,但是將-lC添加到你的鏈接可能會做到。

所以可能使用你的C++編譯器而不是ld進行鏈接。

在任何情況下,你可能有使用C++編譯器,而不是LD,如果你想你的C++代碼才能正常工作聯繫起來 - 它經常需要異常和靜態初始化才能正常工作......

+0

不會將`-lc`鏈接爲`libc`,它是一個C運行時庫,而不是C++?對於C++,需要使用`-lstdC++`參數到`gcc`(或者僅僅使用`g ++`自動執行)來連接C++標準庫`libstdC++`。如果你不知道怎麼做,不要試圖去幫助,因爲你同樣可以做一個惡作劇。 – SasQ 2012-08-04 04:36:06

1

當我試圖用Cygwin(g ++)編譯時,我得到了同樣的確切錯誤。

只需在編譯規則中加上-L/usr/local/bin -L/usr/lib即可。

這可能是特定於Cygwin,但它也可能有助於解決您的問題。