ошибка компоновщика iostream - PullRequest
15 голосов
/ 05 ноября 2008

У меня есть какой-то старый код C, который я хотел бы объединить с кодом C ++.

Используемый код 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 :: operator [] (unsigned int) const '

[Ошибка компоновщика] неопределенная ссылка на `std :: string :: operator [] (unsigned int) const '

[Ошибка компоновщика] неопределенная ссылка на `std :: string :: operator [] (unsigned int) const '

[Ошибка компоновщика] неопределенная ссылка на `std :: ios_base :: Init :: Init () '

[Ошибка компоновщика] неопределенная ссылка на `std :: ios_base :: Init :: ~ Init () '

ld вернул 1 статус выхода

Как мне решить эту проблему?

Редактировать: Мой компилятор - Dev-C ++ 4.9.9.2

Ответы [ 3 ]

28 голосов
/ 05 ноября 2008

Заголовок C string.h и заголовок C ++ string не являются взаимозаменяемыми.

В целом, ваша проблема в том, что файл правильно компилируется, но в него вставлена ​​неверная библиотека времени выполнения.

Dev-C ++ использует GCC. GCC может правильно определить язык в файле на основе расширения файла, но не будет связывать нужную библиотеку времени выполнения, если вы не попросите его об этом (-lstdc ++ в командной строке). Вызов GCC как «g ++» (или, в вашем случае, «mingwin32-g ++») также даст правильный язык и свяжет необходимую библиотеку.

3 голосов
/ 05 ноября 2008

Вам нужно связать свою среду выполнения C ++. Это зависит от вашей платформы и компилятора, но добавление -lC к вашей ссылке может сделать это.

Так что ссылки могут быть использованы с помощью вашего компилятора C ++, а не ld.

В любом случае вам, вероятно, придется ссылаться с помощью компилятора C ++, а не ld, если вы хотите, чтобы ваш код C ++ работал правильно - это часто требуется для корректной работы исключений и статических инициализаторов ...

2 голосов
/ 07 декабря 2015

Я получил точно такую ​​же ошибку, когда пытался скомпилировать с Cygwin (g ++).

просто добавьте -L/usr/local/bin -L/usr/lib в правила компиляции, и оно должно работать.

Это может быть характерно для Cygwin, но может помочь решить и вашу проблему.

...