Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Написание внешних Си функций под Win
|
|||
|---|---|---|---|
|
#18+
Доброго времени суток. Есть необходимость переписать ряд функций с pgplsql на Си. Но при этом возникает целый ряд проблем. Пользуюсь SPI интерфейсом, пишу по аналогии с примерами из документации: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. И .def файл: Код: plaintext При компиляции получаю unresolved external error-ы на все три SPI_ функции. Не хватает .lib файлов. Ищу spi.lib - отсутствует. Где-то на форуме читал совет подключать к проекту postgres.lib, но он у меня тоже отсутствует (искал в установленном из бинарников сервере и в исходниках сервера). Стал искать .dll, в которых экспортируются эти функции, нашёл - в postgres.exe. Тогда делаю следующим образом: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. Ну и .def файл, соответственно: Код: plaintext Делаю так - компилируется и корректно работает. Едем дальше, добавляю в код строчки: Код: plaintext 1. 2. При вызове функции из postgre вылетает с ошибкой чтения памяти, роняя запустивший её процесс. При этом все PG_RETURN_ функции работают исправно. В postgre функцию запускаю так: Код: plaintext 1. 2. 3. 4. Ошибка происходит именно при попытке присвоить значение функции PG_NARGS() какой-нить переменной (или запихнуть её значение в строку через sprintf(sqlbuf, "%d", PG_NARGS())). Если просто вызвать её, ошибки не возникает. Собственно говоря, вопрос: что я делаю не так? И как правильно пользоваться прилагаемыми средствами разработки? Потому что динамически грузить функции из .dll-ки - это через известное место, причём, как показывает практик, тоже не выход, а ни один из примеров (из того же /contrib) не компилируется, ругаясь на unresolved external symbol в большом количестве. Используемая софтина: WinXP PostgreSQL 8.1.4 Visual Studio 6 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.02.2008, 11:22 |
|
||
|
Написание внешних Си функций под Win
|
|||
|---|---|---|---|
|
#18+
Забыл написать. Пробовал подключать к проекту файл libpostgres.a (который имхо и является тем самым postgres.lib, одновременно инклудя spi.h), но в таком случае сначала получал несколько предупреждений линковщика об исключении неиспользуемых функций на стадии оптимизации, а при подключении .dll и вызове функции из postgre опять же ошибку чтения памяти. В коде это выглядело так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Соответственно, .def файл: Код: plaintext И libpostgres.a в качестве дополнительной объектной библиотеки в настройках проекта. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.02.2008, 11:57 |
|
||
|
Написание внешних Си функций под Win
|
|||
|---|---|---|---|
|
#18+
Мне кажется, dll под Postgres рекомендуется собирать с помощью MinGW. По крайней мере, ваш первый пример собрался без проблем, и работает нормально. Где-то на форуме было подробное описание, как это делать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.02.2008, 14:19 |
|
||
|
Написание внешних Си функций под Win
|
|||
|---|---|---|---|
|
#18+
Золотая рыбкаМне кажется, dll под Postgres рекомендуется собирать с помощью MinGW. По крайней мере, ваш первый пример собрался без проблем, и работает нормально. Где-то на форуме было подробное описание, как это делать. Спасибо за наводку, буду копать в этом направлении. А какие-нить либы инклудились? И какие дополнительные пути инклуда (из установленного сервера) прописывались в настройках студии? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.02.2008, 15:35 |
|
||
|
Написание внешних Си функций под Win
|
|||
|---|---|---|---|
|
#18+
Вот тут описано, как с MinGW компилить - тынц Студия там вообще не используется - компилятор gcc. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.02.2008, 16:51 |
|
||
|
|

start [/forum/topic.php?fid=53&tid=2004652]: |
0ms |
get settings: |
7ms |
get forum list: |
8ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
52ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
26ms |
get tp. blocked users: |
1ms |
| others: | 208ms |
| total: | 317ms |

| 0 / 0 |
