Как мне определить HAVE_STDIO_H в VC ++ 2005? - PullRequest
1 голос
/ 21 февраля 2009

Я только что собрал обновленную версию SDL.dll, C-библиотеки с открытым исходным кодом, которую использует мой проект Delphi, с Express Edition Visual C ++ 2005. Я бросил ее в папку с моим EXE и попытался запустить но он не загружается:

The procedure entry point SDL_RWFromFP could not be located in the dynamic
link library SDL.dll. 

Теперь C никогда не был моей сильной стороной, но я достаточно запомнил это из колледжа, чтобы попытаться отследить это. Я покопался в исходном коде, чтобы посмотреть, что случилось с этой функцией, и обнаружил, что она неактивна под директивой препроцессора:

#ifdef HAVE_STDIO_H

IIRC, STDIO - это стандартная библиотека ввода / вывода C. Я предполагаю, что это означает, что это не доступно. Кто-нибудь знает, почему это будет и как это исправить? Это проблема Visual C ++ или SDL?

Ответы [ 3 ]

2 голосов
/ 22 февраля 2009

Чаще всего в мире Unix / Linux такие имена, как HAVE_STDIO_H, указывают на то, что код был «автоматически конфискован» (это официальный термин, используемый для описания состояния работы с «автоинструментами», такими как 'Autoconf'). В такой настройке процесс конфигурирования определит, доступен ли <stdio.h>, и установит #define HAVE_STDIO_H 1 в генерируемом файле config.h. Компиляция тогда обнаружит, что платформа имеет <stdio.h> и скомпилирует соответствующий код (материал, который в настоящее время выделен серым цветом).

Адаптация к вашей среде Windows, несколько менее чем на 100% уверенно, так как в Windows может быть какое-то другое значение для HAVE_STDIO_H, вы можете решить, что будет нормально включить -DHAVE_STDIO_H в параметры командной строки при запуске компилятор. Или вы можете создать файл конфигурации вручную и определить -DHAVE_CONFIG_H (это обычный способ указать, что параметры конфигурации находятся в файле 'config.h'). В файле config.h вы получите #define HAVE_STDIO_H 1, как указано выше.


Примечание: в Unix вы обычно находите скрипт оболочки с именем 'configure', который вы запускаете для создания файла config.h. Если у вас есть Cygwin, есть шанс, что вы сможете использовать этот сценарий в Windows - я только что проверил, что автоматически конфискованный пакет, созданный мной в Solaris, можно настроить в Windows под Cygwin, и он в основном работает - все, за исключением некоторой обработки сети. Я не гарантирую, что он всегда будет терпеть неудачу (но это программное обеспечение - гарантировать что-либо довольно опасно). Я должен добавить, что проблема в моем коде автоконфигурации (тесты сетевой функциональности явно не совсем корректны), а не в Cygwin как таковом. Если бы я сделал работу правильно, она бы сработала. (Кто-то сказал: «Нет переносимого кода; есть только перенесенный код». Это применимо здесь.)

Вам нужна хорошая симуляция среды Unix. MingW также может работать.

1 голос
/ 22 февраля 2009

Что делают директивы препроцессора над ним?

Скорее всего, это просто для определения некоторых свойств вашего компилятора, и он отображается серым, потому что независимо от того, что означает макрос, не применяется к вашему компилятору.

Ваша проблема, скорее всего, в другом месте.

Поскольку она не может найти функцию SDL_RWFromFP, вы, вероятно, должны увидеть, отключена ли эта функция по какой-либо причине директивой препроцессора.

Однако я предполагаю, что функция существует, но не помечается как __declspec (dllexport)

Без этого он не будет выставлен, поэтому программы, загружающие DLL, могут вызывать его. Скорее всего, вам нужно #define что-то указать, что вы хотите создать DLL, что позволит необходимой магии препроцессора вставить часть dllexport перед функцией.

0 голосов
/ 22 февраля 2009

Как правило, вам не нужно добавлять какие-либо HAVE_STDIO_H: они все равно не должны быть публичными (хотя, к сожалению, многие проекты загрязняют ими публичное пространство имен).

Я полагаю, что вы не создали SDL правильно - или что Visual Studio 2005 не очень хорошо поддерживается SDL (я не знаю много о SDL, так что это действительно дикие догадки без большой информации). Есть ли какой-нибудь набор тестов для SDL, например, вы можете протестировать встроенную dll?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...