Cmake: вызывает несуществующие ошибки

#c #makefile #cmake #codeblocks

#c #makefile #cmake #codeblocks

Вопрос:

В моем проекте на C у меня есть 4-5 файлов. Сначала я протестировал их, напрямую включив исходные файлы во включаемый раздел. Для этого я использовал codeblocks.Моя программа работала абсолютно нормально.

Но проблема возникла, когда я попытался создать проект с помощью Cmake. Я указал генератор для проекта как MingW Makefiles и поставил галочку « Use default native compiler «. Настройка и генерация будут выполнены.

Когда я запускаю с помощью команды mingw32-make , я получаю сообщение об ошибке

 error: too few arguments to function 'strnlen'
 int len=strnlen(buf);
  

Я включил string.h, но ошибка все еще сохраняется. Эти ошибки никогда не появлялись при запуске непосредственно в codeblocks. Я попытался сменить компилятор на компиляторы в папке codeblocks. Бесполезно.
Любое предложение, например, какой компилятор я должен заставить его работать? Idk, где находится расположение компилятора codeblocks по умолчанию..

Комментарии:

1. Вы пытались прочитать документацию по этой функции? Например man 3 strnlen ?

2. Эта функция, похоже, не определена в string.h соответствии со стандартом (по крайней мере, в виде cppreference.com ). Для всех strnlen функций, которые я нашел, требуется 2 параметра. Не уверен, где codeblocks получает эту функцию, но вы не можете полагаться на то, что эта функция доступна для других компиляторов…

Ответ №1:

Это не имеет ничего общего с cmake или codeblocks. Ваш код неверен. strnlen требуется два аргумента. Код, скомпилированный (и, вероятно, зависший бы, если бы вы его запустили) раньше, просто потому, что в C вы можете делать глупости, например, использовать функцию, которая никогда не была объявлена, и C «услужливо» (нет!) объявит функцию для вас.

Итак, в коде, который был скомпилирован, компилятор «услужливо» добавил неявное объявление следующим образом:

 int strnlen(...);
// in C this means exactly the same as
int strnlen(); // a function returning int and taking any number of arguments (!)
  

Проблема в том, что это неправильное определение этой функции, и программа имела неопределенное поведение и может завершиться сбоем, или может показаться, что она работает, и сломается, когда вы меньше всего этого ожидаете (обычно во время демонстрации или это не сработает для вашего профессора, если это было домашнее задание).

Вам нужно будет выяснить, какой заголовок использовать, чтобы эта конкретная функция стала доступной. В Linux и Windows это было бы string.h , но не всегда присутствует в Windows (например, некоторые компиляторы могут не предоставлять эту функцию в своих заголовках или библиотеке времени выполнения).