Проблемы при попытке скомпилировать программу с внешним заголовком - PullRequest
1 голос
/ 16 августа 2011

Я изучаю c ++ и пытаюсь использовать библиотеку, которую я скачал из Интернета, в моей программе (отсюда https://mattmccutchen.net/bigint/). Поскольку я хочу, чтобы все было достаточно аккуратно, я поместил все .hh файлы в подпапку с именем «BI». Однако, когда я пытаюсь скомпилировать мой файл .cpp с помощью g ++ (это MinGW в Windows XP SP3), компилятор выдает следующую ошибку:

J:\comp proj\FS>J:\Programmi\MinGW\bin\g++.exe "J:\comp proj\FS\test.cpp" -o "J:\comp proj\FS\test.exe" -I "J:\comp proj\FS\BI" E:\DOCUME~1\MrJackV\IMPOST~1\Temp\ccidH1Z6.o:test.cpp:(.text+0x2c): undefined reference to <code>BigInteger::BigInteger(int)' E:\DOCUME~1\MrJackV\IMPOST~1\Temp\ccidH1Z6.o:test.cpp:(.text+0x11b): undefined reference to operator << (std :: ostream &, BigInteger const &) ' E: \ DOCUME ~ 1 \ MrJackV \ IMPOST ~ 1 \ Temp \ ccidH1Z6.o: test.cpp :(. Text $ <em>ZNK10BigIntegermlERKS [BigInteger :: operator * (BigInteger const &) const] + 0x29): неопределенные ссылки в BigInteger :: multiply (BigInteger const &, BigInteger const &) ' collect2: ld вернул 1 статус выхода

Я пытался использовать переключатели -I, -l and -L для решения проблемы, но безуспешно. Более того, я попытался в cpp поставить #include "BI/BigIntegerLibrary.hh", но это не сработало.

Есть ли что-то, что я делаю не так?

Заранее спасибо.

Ответы [ 4 ]

3 голосов
/ 16 августа 2011

Вам нужно использовать оба ключа -L и -l. -L чтобы указать каталог, содержащий двоичный файл библиотеки, -l, чтобы назвать этот двоичный файл

например. -L / home / ed / libs -lmath

0 голосов
/ 18 августа 2011

Хорошо, поэтому после некоторого возни я понял, что мне нужно сделать пару вещей

  1. добавить ключ -L с каталогом заголовочных файлов
  2. добавить в командную строку g ++ все файлы .cc (например, g ++ test.cpp BigInteger.cc и т. Д.)
  3. поместите все в командный файл для простоты

Ух ты, теперь это кажется довольно простым!

0 голосов
/ 16 августа 2011

Ваша проблема в том, что вы не связались с кодом библиотеки.
Прочитайте «README», затем следуйте его советам, чтобы адаптировать прилагаемый Makefile.

0 голосов
/ 16 августа 2011

Есть два ключевых слова, которые нужно иметь в виду. Undeclared означает, что компилятор никогда не слышал об этом. Undefined означает, что компилятор слышал об этом, но не знает точно, как его использовать. Для этих ошибок вам нужно указать ссылку для связи с библиотекой BigInteger, которая должна быть в комплекте с заголовками (файл * .lib). Я уверен, что именно в gcc есть библиотеки ссылок (Эд Хил говорит -L и -l, я сделал бы это).

...