|
0 / 0 / 0
Регистрация: 21.01.2010
Сообщений: 11
|
|
Линковка dll от netCDFв фортрановский проект05.03.2011, 17:15. Показов 4608. Ответов 13
Метки нет (Все метки)
Привет!
Столкнулся с проблемой - не получается использовать в проекте файлы для поддержки netcdf вывода, реализованного в фортрановской программе. Проект создан в Visual Studio 2008, интегрированный компилятор - Intel Fortran Compiler 11.1. При использовании старого Compaq Visual Fortran проблем не было, но при пересборке в VS 2008 на стадии линковки (компиляция проходит без ошибок) вылетают такие ошибки: 1>Linking... 1>pom2k_CDF.obj : error LNK2019: unresolved external symbol _NF_STRERROR referenced in function _HANDLE_NETCDF_ERROR 1>pom2k_CDF.obj : error LNK2019: unresolved external symbol _NF_DEF_VAR referenced in function _DEF_VAR_NETCDF и т.д. То есть получается, что линковщик не видит заголовков, что ли? Заголовочный файл от netcdf.fi в проект включен, файл netcdf.dll лежит в папке этого проекта. Может кто подсказать, что может быть не так? Скорее всего, в настойках проетка надо добавить путь, но я это делал - не помогло. Хотя возможно в чем-то ошибся. Заранее спасибо!
0
|
|
| 05.03.2011, 17:15 | |
|
Ответы с готовыми решениями:
13
линковка *.asm к dll Линковка DLL с произвольным размещением Линковка завершается ошибкой. Проект для AVR |
|
294 / 206 / 2
Регистрация: 20.02.2011
Сообщений: 551
|
|
| 05.03.2011, 18:00 | |
|
Moжет, линковщик хочет, чтобы ему подсунули не саму dll, а библиотеку импорта для этой dll?
0
|
|
|
0 / 0 / 0
Регистрация: 21.01.2010
Сообщений: 11
|
||
| 05.03.2011, 20:53 [ТС] | ||
UPD: О, сделал, все слинковалось и заработало! Пришлось пересобрать проект и по-новой выставить все настройки. Забавно, но все настроил, вроде бы, так же, как в первый раз. Как я понял, как таковой ошибки и не было, но линковщик почему-то не воспринимал заданные в настройках параметры. Ну, или я задал какой-то "волшебный" параметр, который пропустил в первый раз.
0
|
||
|
294 / 206 / 2
Регистрация: 20.02.2011
Сообщений: 551
|
|
| 05.03.2011, 20:54 | |
|
Coвсем ведь забыл: у меня похожая петрушка была с PGI, не хотел ничего компилировать, линковщик ругался во всю. Вылечилось элементарно: прописал в переменных среды временную папку как С:\ТЕМР, без русских букв - это главное. А, может, и пробелы в путях к этой папке пакостят? Не знаю, с этим не экспериментировал.
ЗЫ: О, вот написал, а оказывается, дело не в этом!
1
|
|
|
0 / 0 / 0
Регистрация: 21.01.2010
Сообщений: 11
|
|||
| 06.03.2011, 01:00 [ТС] | |||
![]()
0
|
|||
|
0 / 0 / 0
Регистрация: 10.04.2011
Сообщений: 5
|
|
| 10.04.2011, 19:30 | |
|
Всем добрый день!
Я сейчас пытаюсь создать простенький проект на Фортране как раз для чтения данных из netCDF-файла. Сам я в программировании почти новичок. Работаю на Windows 7 (x64), Visual Studio 2010, интегрированный компилятор PGI Fortran 2010. И текст подпрограммы, читающей файл, и сам файл уже готовы (то есть всё совсем хорошо): ftp://ftp.cdc.noaa.gov/Dataset... readspec.f — текст подпрограммы (из него мне нужна лишь часть, но это не принципиально); ftp://ftp.cdc.noaa.gov/Dataset... ec.2011.nc — сам файл для чтения (размер под 3 мегабайта). Всё бы хорошо, но вот собрать проект у меня не получается. Скорее всего, дело в том, что Visual Studio не видит dll. Кроме того, я не уверен, что использую ВСЕ необходимые dll (на официальном сайте довольно-таки неподробное описание того, как что подключать — наверно, рассчитано на людей поопытнее). Файл «netcdf.inc» я скачал и прописал к нему путь в программе (точнее, поправил, по умолчанию там другое). В общем, я очень прошу у более опытных коллег помощи в правильной конфигурации проекта и скармливанию студии всего, что нужно! P.S. Добавлю, что проект компилируется, но не собирается, выдаются сообщения наподобие «readspec.obj : error LNK2019: unresolved external symbol _NCVID@16 referenced in function _SPECREADPS@12». Пробовал создать и 32-хбитный, и 64-хбитный проекты. Добавлено через 10 минут Думаю, если я понимаю, в чём дело, эту просьбу можно переформулировать в виде вопроса о том, какие dll-библиотеки нужно использовать и как их подключить.
0
|
|
|
294 / 206 / 2
Регистрация: 20.02.2011
Сообщений: 551
|
|
| 11.04.2011, 00:09 | |
|
Сообщение линковщика означает, что он нигде не может найти некую подпрограмму NCVID, упомянутую (возможно, с атрибутом external) в подпрограмме SPECREADPS. Гугль дает ссылочку на сайт разработчика с примером использования NCVID, там для использования подключали только netcdf.inc.
Возможно, линковщик не может найти _NCVID@16 из-за того, что там (в библиотеке) все функции прописаны в нижнем регистре. То есть я не скачивал, не знаю. Надо посмотреть эту библиотеку НЕХ-редактором или хоть блокнотом. После нескольких строк кракозябров должен появиться список включенных функций (все подряд и скопом, но разобраться можно). Вот и посмотреть, какой там регистр. _NCVID@16 там или _ncvid@16. Если регистр нижний, значит, надо искать ключик для компиляции, который заставит PGI Fortran работать с символами функций в нижнем регистре. А вообще битность проекта должна соответствовать битности dll: 64-битная программа с 32-битной dll работать не сможет.
0
|
|
|
0 / 0 / 0
Регистрация: 10.04.2011
Сообщений: 5
|
|
| 11.04.2011, 00:43 | |
|
MOHCTP, большое спасибо!
Да, я посмотрел dll-ку и обнаружил, в самом конце, перечисление этих функций. Там они действительно написаны в нижнем регистре. Но у меня, хотя я и не являюсь в вопросах программирования для самого себя авторитетом, есть некоторые сомнения на этот счёт: во-первых, в тексте самой подпрограммы, вызывающей эти функции, они написаны в нижнем регистре; во-вторых, когда я собирал проект в 64-битном режиме, ошибки были аналогичные, но в нижнем регистре и с нижними подчёркиваниями в конце, например, так: «readspec.obj : error LNK2019: unresolved external symbol ncvid_ referenced in function specreadps_». Добавлю ещё, что есть машинка с Compaq Visual Fortran. Там тоже аналогичные ошибки. MOHCTP, а как нужно искать ключик для компиляции? Кстати, для компиляции ли? Ведь компилируется всё без ошибок, а ошибки на этапе построения решения. Наверняка сказываются пробелы в моих знаниях программирования, поскольку компилирования для меня это нажатие на Ctrl+F7. А ключик, видимо, используется, при компилировании из командной строки.
0
|
|
|
294 / 206 / 2
Регистрация: 20.02.2011
Сообщений: 551
|
|
| 11.04.2011, 22:00 | |
|
Фортран - язык, можно сказать, древний. Во времена его молодости ЭВМ печатали только большими буквами, и вплоть до стандарта Фортрана-90 он официально нижний регистр не понимал. После этого настали некоторые послабления, но все равно фортран верхний и нижний регистр не различает. То, как будет выведено имя функции - NCVID или ncvid, зависит от настроек компилятора. Чтобы от них не зависеть, можно воспользоваться директивой alias. Имя функции, определенное через alias, должно восприниматься именно так как написано, с учетом регистра. Примерно так, наверно:
integer, external :: ncvid !DEC$ ATTRIBUTES STDCALL, DECORATE, ALIAS : 'ncvid' :: ncvid Про то, что эта функция поддерживает STDCALL, сужу по тому, что к ней приписаны знак подчеркивания и @16. Приписывать все эти финтифлюшки как раз и требует директива DECORATE. Без нее нужно писать примерно так: !DEC$ ATTRIBUTES STDCALL, ALIAS : '_ncvid@16' :: ncvid - для CVF, скорее всего, больше подойдет такой способ.
0
|
|
|
0 / 0 / 0
Регистрация: 10.04.2011
Сообщений: 5
|
||||||
| 11.04.2011, 22:59 | ||||||
|
MOHCTP, в проекте используется inc-файл, внутри которого эти функции объявляются. В частности, там есть такие строки:
0
|
||||||
|
294 / 206 / 2
Регистрация: 20.02.2011
Сообщений: 551
|
|
| 12.04.2011, 08:19 | |
|
Тогда все может быть хуже. Проблема в том, что (судя по справке на сайте) исходная библиотека может использоваться с компилятором g77, а он в принципе не способен работать с функциями STDCALL. Скорее всего, там все же обычные Сишные функции - CDECL. Между ними небольшая разница в том, как им передаются данные. То, как ругается линковщик, показывает, что компилятор сделал таки в коде запрос на подключение STDCALL функции NCVID (на это указывает дополнение @16 - ей передается 16 байтов данных, а @ характерно для функций STDCALL).
В inc-файле никак не указано, являются ли эти функции STDCALL или CDECL. Проблема в том, что долгое время в Фортране вообще не было никакого стандартного способа это указать. Только со стандартом Фортран-2003 такая возможность появилась, но еще далеко не все компиляторы полностью поддерживают этот стандарт. Проще сказать, что вряд ли хоть один полностью поддерживает. Поэтому у многих компиляторов появились свои более-менее нестандартные способы указать тип функции. Предположительно, ситуация такая: функция в библиотеке имеет тип CDECL и ее название записано в нижнем регистре (что уже выяснили). CDECL она или STDCALL, можно определить опять же, просмотрев эту библиотеку хоть в блокноте: приписываются ли после имен функций штуковины вроде @16, @12, @24 и т.п. Если приписываются, то это функции STDCALL, если нет - то CDECL. Поскольку STDCALL - это стандарт для системных функций Windows, a у Вас PGI Fortran встроен в Visual Studio от Мелкомягких, то, возможно, там по умолчанию где-то прописан тип функции STDCALL при обращении к внешним функциям. Если функция в библиотеке все же имеет тип CDECL, то с таким поведением компилятора надо бороться. Люди, написавшие inc-файл, не могли предусмотреть всё, поскольку не знали, с каким именно компилятором Вы будете работать. Тем более что стандартного варианта указать тип функции в Фортране, можно сказать, и нету. Поэтому Вам придется самому переписать inc-файл, примерно таким образом: integer, external :: ncvid !DEC$ ATTRIBUTES CDECL, ALIAS : 'ncvid' :: ncvid Или, вариант номер два: ничего не переписывать, просто воспользоваться бесплатным компилятором g95. У него по умолчанию предусмотрены нижний регистр и CDECL. Только не надо скачивать под Windows версии, помеченные как Cygwin. Годится только то, что помечено как Self-extracting Windows x86 - они не требуют больше ничего для работы.
0
|
|
|
0 / 0 / 0
Регистрация: 10.04.2011
Сообщений: 5
|
|
| 15.04.2011, 20:35 | |
|
Вы знаете, я скачал и установил компилятор g95, но совершенно не понимаю, как им пользоваться, уж простите новичка. Видимо, должен быть какой-то интерфейс из командной строки (ну или, быть может, как-то можно воспользоваться им из Visual Studio, хотя вряд ли).
Пока решил выполнять задачи, используя для работы с этими файлами MatLab, чтобы процесс не стоял на месте, но Фортрану это не замена, конечно, так что буду пытаться дальше.
0
|
|
|
294 / 206 / 2
Регистрация: 20.02.2011
Сообщений: 551
|
|
| 15.04.2011, 22:09 | |
|
Компилятор g95 запускается из командной строки, в простейшем случае - "g95 файл.f95", вроде этого. Обиходные ключики для командной строки приведены в документации. К сожалению, документация не полная (хотя бы по части этих ключиков), так как компилятор этот сидит, в конечном счете, поверх gcc, и ключики от gcc (касающиеся, в частности, подгонки под определенный процессор, что весьма существенно) надо брать именно из документации к gcc. Конечно, в Visual Studio этот компилятор не встраивается, это не реально. Но можно использовать бесплатные IDE, вроде SciTE. Эта программа - не только редактор с подсветкой синтаксиса, но она еще она позволяет запускать компилятор и ловить его вывод (в смысле, на что он там ругался при компиляции). К сожалению, по умолчанию для Фортрана там прописан компилятор от Интела, но, пользуясь справкой, можно прописать все что угодно. Хоть бы и g95.
0
|
|
|
0 / 0 / 0
Регистрация: 10.04.2011
Сообщений: 5
|
|
| 16.04.2011, 00:31 | |
|
Спасибо большое! Буду разбираться.
0
|
|
| 16.04.2011, 00:31 | |
|
Помогаю со студенческими работами здесь
14
Open MP vcomp140.dll статическая линковка Динамическая линковка dll в процессе выполнения программы
Линковка DLL Direct3D и XAudio в один exe
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ВВЕДЕНИЕ
Введу сокращения:
аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
|
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi
ветка по-частям.
коммит Create переделка под биомассу. txt
вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
|
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ *
Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях.
Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её.
Последовательность действий:. . .
|
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
|
|
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение.
И на уровне агентов добавится между грибами или бактериями взаимодействий.
До того я пробовал подход через многомерные массивы,. . .
|
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Налог на собак: https:/ / **********/ gallery/ V06K53e
Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf
Пост отсюда. . .
|
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop?
Ниже её машинный перевод.
После долгих разбирательств я наконец-то вернула себе. . .
|
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод
Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод.
Thinkpad X220 Tablet —. . .
|