Обычно каждая единица перевода генерирует объектный файл, содержащий определения символов, определенных в этой единицы перевода. Чтобы использовать эти символы, вам необходимо связать эти объектные файлы.
В разделе gcc вы должны указать все объектные файлы, которые должны быть связаны вместе в командной строке, или скомпилировать файлы реализации вместе.
g++ -o test objectFile1.o objectFile2.o -lLibraryName
Здесь libraryName
- это просто имя библиотеки, без добавления к платформе. Так, например, в файлах библиотеки Linux обычно называют libfoo.so
, но вы должны писать только -lfoo
. В Windows этот же файл можно назвать foo.lib
, но вы будете использовать тот же аргумент. Возможно, вам придется добавить каталог, в котором эти файлы можно найти, используя -L‹directory›
. Обязательно не записывайте пробел после -l
или -L
.
Для XCode: добавьте пути поиска заголовка пользователя -> добавьте путь поиска библиотеки -> перетащите фактическую ссылку библиотеки в
В MSVS файлы, добавленные в проект, автоматически связывают их объектные файлы, и будет создан файл lib
(в общем использовании). Чтобы использовать символы в отдельном проекте, вам нужно будет добавить файлы lib
в параметры проекта. Это делается в разделе Linker свойств проекта в Input -> Additional Dependencies
. (путь к файлу lib
должен быть добавлен в Linker -> General -> Additional Library Directories
). При использовании сторонней библиотеки, которая предоставляется с файлом lib
, отказ в этом обычно приводит к ошибке.
Также может случиться так, что вы забудете добавить файл в компиляцию, и в этом случае объектный файл не будет сгенерирован. В gcc вы должны добавить файлы в командную строку. В MSVS добавление файла в проект заставит его скомпилировать его автоматически (хотя файлы могут, вручную, быть отдельно исключены из сборки).
В программировании Windows контрольный знак, который вы не связывали необходимая библиотека состоит в том, что имя неразрешенного символа начинается с __imp_
. Посмотрите имя функции в документации, и она должна сказать, какую библиотеку вам нужно использовать. Например, MSDN помещает информацию в поле внизу каждой функции в разделе «Библиотека».
Это одна из причин, по которой atoi
иногда считается небезопасной. Вместо этого используйте strtol
/ strtoul
. И если вы используете strtonum
.
Функция atoi
более опасна, чем вы думаете. Стандарт POSIX
говорит:
Если значение не может быть представлено, поведение не определено.
blockquote>Стандарт C99 это также говорит:
7.20.1
Функции atof, atoi, atol и atoll не должны влиять на значение целочисленного выражения errno при ошибке. Если значение результата не может быть представлено, поведение не определено.
blockquote>
Я использовал
#include <stdlib.h>
using namespace std;
перед основным и не проблема для использования atoi, но будьте осторожны, он не может обнаружить переполнение или неправильные входы. используя strtol немного сложно, проверьте этот для получения дополнительной информации
Вы не можете.
atoi
не может обнаружить ошибки. Если результат не может быть представлен, atoi
вызывает неопределенное поведение. Используйте strtol
вместо atoi
.
Безопасное кодирование CERT советует использовать strtol
вместо atoi
, читать:
INT06-C. Используйте strtol () или связанную функцию для преобразования токена строки в целое число