LINUX.ORG.RU

libpython27.a, Google, MinGW64 и MS Visual C++


1

3

Пишу кросс-платформенное приложение (под Linux, Windows 32-bit, 64-bit). Под Линуксом всё замечательно - всё компилируется. Под виндой тоже всё было замечательно под WinXP 32-bit, Python-2.5.4 (для сборки питоновского модуля на Си используется libpython25.a). Попробовал собрать под Win7 Professional 64-bit, Python-2.7.3. Оказалось, что среди файлов Python 2.7 нет библиотеки libpython27.a Погуглил. И нашел такое фразу разработчиков Python: http://stackoverflow.com/questions/7492416/building-64bit-libpython27-a-using...

Do not use MinGW-w64. As you will notice, the MinGW
 import library for Python (e.g. libpython27.a) is omitted
 from the AMD64 version of Python. This is deliberate. Do not
 try to make one using dlltool. There is no official
 MinGW-w64 release yet, it is still in "beta" and considered
 unstable, although you can get a 64-bit build from e.g.
 TDM-GCC. There have also been issues with the mingw runtime
 conflicting with the MSVC runtime; this can happen from
 places you don't expect, such as inside runtime libraries
 for g++ or gfortran. To stay on the safe side, avoid
 MinGW-w64 for now.

Почему разработчики Python так уважительно относятся к Linux'у и Microsoft Visual Studio, и так пренебрежительно - к MinGW-GCC и исправлению багов в виндовых версиях Питона? http://www.python.org/download/releases/2.5.4/

Python 2.5.4
  We are pleased to announce the release of Python 2.5.4
 (final), a bugfix release of Python 2.5, on December 23rd,
 2008.
  Python 2.5.4 has been replaced by a newer bugfix release of
 Python. Please download Python 2.5.6 instead, unless you
 need to use the Windows and OS X binaries provided
 here.
Microsoft Visual C++ и CLang - наше фсьо?

★★★★★
Ответ на: комментарий от quiet_readonly

В тех тестах, что имелись у меня (параметры msvc и mingw задавал не я, а организаторы NEERC) mingw на вводе-выводе рвал msvc в 2,5 раза

вводе/выводе куда и чего? версии gcc и msvc ?

Reset ★★★★★
()
Ответ на: комментарий от Reset

Не собирается только гнутый быдлокод

У меня тогда два вопроса:

1. cl.exe уже умеет C99? Не C++98, не C++11, а C99?

2. То что cl.exe для amd64 не умеет ANSI C (так, напрмер, ANSI C говорит, что size_t не может быть больше чем long, что нарушается в API из Windows для x86_64 архитектуры) это признак того, что корректные с точки зрения ANSI C программы — быдлокод?

kim-roader ★★
()
Ответ на: комментарий от quiet_readonly

Кстати, погуглил бенчмарки. Например тут http://keyj.emphy.de/compiler-benchmark/ говорят, что результаты в MinGW 4.3.2 и MSVC 2008 примерно одинаковые. По другим ссылкам по большей части пишут, что MinGW даёт код, который работает значительно быстрее.

kim-roader ★★
()
Ответ на: комментарий от kim-roader

1. cl.exe уже умеет C99? Не C++98, не C++11, а C99?

Не умеет. Но его полностью не умеет ни один компилятор.

так, напрмер, ANSI C говорит, что size_t

здесь должна быть ссылка на раздел стандарта

Reset ★★★★★
()
Ответ на: комментарий от kim-roader

По другим ссылкам по большей части пишут, что MinGW даёт код, который работает значительно быстрее.

Подозреваю, что другие ссылки устаревшие, где проводились сравнения времена 6й студии. В те времена у ms было всё плохо.

Reset ★★★★★
()
Ответ на: комментарий от Reset

здесь должна быть ссылка на раздел стандарта

Да пожалуйста. Третий абзац пункта 3.1.2.5 ANSI стандарта говорит, что существует лишь 4 знаковых целочисленных типа (signed char, short, int, long int), пятый абзац того же пункта указывает, что для каждого знакового целого существует беззнаковый занимающий тот же объём памяти, а пункт 4.1.5 говорит, что size_t является беззнаковым целым. (Пруф? Кто сказал пруф? Иди купи свою копию текста! Но можешь посмотреть в http://flash-gordon.me.uk/ansi.c.txt )

Таким образом size_t не может быть больше чем long. А возвращаясь к «гнутому быдлокоду» смотрим в http://www.gnu.org/prep/standards/standards.html :

don’t make any effort to cater to the possibility that long will be smaller than predefined types like size_t
1989 Standard C requires this to work, and we know of only one counterexample: 64-bit programs on Microsoft Windows.

То есть только MS за всё время умудрились не поддержать даже ANSI стандарт языка C.

kim-roader ★★
()
Ответ на: комментарий от kim-roader

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

А возвращаясь к «гнутому быдлокоду» смотрим в http://www.gnu.org/prep/standards/standards.html

Это быдлокод и за такое надо за яйца вешать. Для фокусов из примера есть ptrdiff_t.

Reset ★★★★★
()
Ответ на: комментарий от kim-roader

Кстати, если уж совсем придираться к словам, то такое

int main()
{
        long long t1;
}
не должно компилироваться с gcc -std=c89 а ведь компилируется, зараза

Reset ★★★★★
()
Ответ на: комментарий от Reset

в те древние времена в стандарте не было типа long long, о 64х битах тогда никто не думал

А как все стали делать 64 бита, то почему то только у MS засвербило в одно место и они намеренно сломали поддержку стандарта, хотя у всех остальных всё работает.

Для фокусов из примера есть ptrdiff_t

Ты ещё и пример не понял? Конечно, в первом случае подходящий тип size_t, а во втором ptrdiff_t, но ведь в примерах речь о выводе, а не о хранении данных. И в ANSI C не было ни %zu, ни %td для вывода значений соответствующего размера. Ни даже %jd для того чтобы число гарантированно можно было конвертнуть. Так что описанный там вариант, без тонн макромагии в каждой программе, был единственно верным. Может сам сначала C выучишь, прежде чем называть единственный гарантированный, с точки зренрия ANSI C, вариант реализации быдлокодом?

kim-roader ★★
()
Ответ на: комментарий от Reset

А чтобы обойти самостоятельно созданные проблемы MS ещё ввели модификатор I (заглавная i), который не соответствует общему развитию языка (модификаторы z и t). Таким образом переносимый код будет выглядеть как

#ifdef _WIN64
printf ("size = %Iu\n", (size_t) sizeof array);
#elif __STDC_VERSION__ >= 199901L
printf ("size = %zu\n", (size_t) sizeof array);
#else
printf ("size = %lu\n", (unsigned long) sizeof array);
#endif

А, учитывая что практически все платформы корректно работают с ANSI C, то отдельный код для C99 можно не писать:

#ifdef _WIN64
printf ("size = %Iu\n", (size_t) sizeof array);
#else
printf ("size = %lu\n", (unsigned long) sizeof array);
#endif

В первой же строке этого кода написано в чём проблема.

kim-roader ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.