Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Не найдена функция в dll


Автор: nnn2k 25.7.2019, 02:48
Уважаемые коллеги!

К сожалению не имею опыта в разработке под C/C++ и тем более библиотек. Цели изучить данный язык сейчас не стоит, в связи с чем прошу подсобить знающих в вопросе.

Занимаюсь разработкой в PostgreSQL, в котором появилась необходимость установить расширение - индекс для полнотекстового поиска Rum.

Установка производится из под Postgres
Код
CREATE EXTENSION rum;

ОШИБКА:  не удалось открыть управляющий файл расширения "C:/Program Files/PostgreSQL/11/share/extension/rum.control": No such file or directory

Скачал расширение от сюда https://github.com/postgrespro/rum.

Положил файл rum.control и файлы rum-x.x.sql в каталог.

ОШИБКА:  нет доступа к файлу "$libdir/rum": No such file or directory

Нужна библиотека dll для Windows x64. В readme и на форумах сборка под Linux. Поиск по сайтам для скачивания dll такой файл не выдал. Нашел инструкцию по сборке библиотеки под Visual Studio https://www.2ndquadrant.com/en/blog/compiling-postgresql-extensions-visual-studio-windows/. Скачал, установил Visual Studio 2019 Community. Сделал все по инструкции. Компиляцию произвести удалось, библиотека создана. Копирую по пути "...\11\lib\".

ОШИБКА:  не удалось найти функцию "rumhandler" в файле "C:/Program Files/PostgreSQL/11/lib/rum.dll"

Здесь я попробовал разобраться сходу, но не удалось. Сдался. Прошу помощи.

В заголовочном файле rum.h такая функция объявлена.
Код

extern Datum rumhandler(PG_FUNCTION_ARGS);

Судя по всему тело функции лежит в файле rumutil.c
Код

Datum
rumhandler(PG_FUNCTION_ARGS)
{...}


Вывод dumpbin по моей скомпилированной библиотеке.
Код

Microsoft (R) COFF/PE Dumper Version 14.21.27702.2
Copyright (C) Microsoft Corporation.  All rights reserved.


Dump of file ..\rum\x64\Release\rum.dll

File Type: DLL

  Section contains the following exports for rum.dll

    00000000 characteristics
    FFFFFFFF time date stamp
        0.00 version
           1 ordinal base
         156 number of functions
         156 number of names

    ordinal hint RVA      name

          1    0 000017F0 Pg_magic_func = Pg_magic_func
          2    1 00006040 RumArraySimilarityFunction = RumArraySimilarityFunction
          3    2 00006038 RumArraySimilarityThreshold = RumArraySimilarityThreshold
          4    3 00006650 RumFuzzySearchLimit = RumFuzzySearchLimit
          5    4 00001810 pg_finfo_rum_anyarray_config = pg_finfo_rum_anyarray_config
          6    5 00001840 pg_finfo_rum_anyarray_consistent = pg_finfo_rum_anyarray_consistent
          7    6 00001870 pg_finfo_rum_anyarray_distance = pg_finfo_rum_anyarray_distance
          8    7 00001850 pg_finfo_rum_anyarray_ordering = pg_finfo_rum_anyarray_ordering
          9    8 00001860 pg_finfo_rum_anyarray_similar = pg_finfo_rum_anyarray_similar
         10    9 00001720 pg_finfo_rum_bit_compare_prefix = pg_finfo_rum_bit_compare_prefix
         11    A 00001710 pg_finfo_rum_bit_extract_query = pg_finfo_rum_bit_extract_query
         12    B 00001700 pg_finfo_rum_bit_extract_value = pg_finfo_rum_bit_extract_value
         13    C 00001000 pg_finfo_rum_btree_consistent = pg_finfo_rum_btree_consistent
         14    D 000016F0 pg_finfo_rum_bytea_compare_prefix = pg_finfo_rum_bytea_compare_prefix
         15    E 000016E0 pg_finfo_rum_bytea_extract_query = pg_finfo_rum_bytea_extract_query
         16    F 000016D0 pg_finfo_rum_bytea_extract_value = pg_finfo_rum_bytea_extract_value
         17   10 000016C0 pg_finfo_rum_char_compare_prefix = pg_finfo_rum_char_compare_prefix
         18   11 000016B0 pg_finfo_rum_char_extract_query = pg_finfo_rum_char_extract_query
         19   12 000016A0 pg_finfo_rum_char_extract_value = pg_finfo_rum_char_extract_value
         20   13 00001660 pg_finfo_rum_cidr_compare_prefix = pg_finfo_rum_cidr_compare_prefix
         21   14 00001650 pg_finfo_rum_cidr_extract_query = pg_finfo_rum_cidr_extract_query
         22   15 00001640 pg_finfo_rum_cidr_extract_value = pg_finfo_rum_cidr_extract_value
         23   16 000015A0 pg_finfo_rum_date_compare_prefix = pg_finfo_rum_date_compare_prefix
         24   17 00001590 pg_finfo_rum_date_extract_query = pg_finfo_rum_date_extract_query
         25   18 00001580 pg_finfo_rum_date_extract_value = pg_finfo_rum_date_extract_value
         26   19 00001820 pg_finfo_rum_extract_anyarray = pg_finfo_rum_extract_anyarray
         27   1A 00001830 pg_finfo_rum_extract_anyarray_query = pg_finfo_rum_extract_anyarray_query
         28   1B 000018A0 pg_finfo_rum_extract_tsquery = pg_finfo_rum_extract_tsquery
         29   1C 000018B0 pg_finfo_rum_extract_tsquery_hash = pg_finfo_rum_extract_tsquery_hash
         30   1D 00001880 pg_finfo_rum_extract_tsvector = pg_finfo_rum_extract_tsvector
         31   1E 00001890 pg_finfo_rum_extract_tsvector_hash = pg_finfo_rum_extract_tsvector_hash
         32   1F 000011E0 pg_finfo_rum_float4_compare_prefix = pg_finfo_rum_float4_compare_prefix
         33   20 000011F0 pg_finfo_rum_float4_config = pg_finfo_rum_float4_config
         34   21 00001200 pg_finfo_rum_float4_distance = pg_finfo_rum_float4_distance
         35   22 000011D0 pg_finfo_rum_float4_extract_query = pg_finfo_rum_float4_extract_query
         36   23 000011C0 pg_finfo_rum_float4_extract_value = pg_finfo_rum_float4_extract_value
         37   24 00001240 pg_finfo_rum_float4_key_distance = pg_finfo_rum_float4_key_distance
         38   25 00001210 pg_finfo_rum_float4_left_distance = pg_finfo_rum_float4_left_distance
         39   26 00001230 pg_finfo_rum_float4_outer_distance = pg_finfo_rum_float4_outer_distance
         40   27 00001220 pg_finfo_rum_float4_right_distance = pg_finfo_rum_float4_right_distance
         41   28 00001270 pg_finfo_rum_float8_compare_prefix = pg_finfo_rum_float8_compare_prefix
         42   29 00001280 pg_finfo_rum_float8_config = pg_finfo_rum_float8_config
         43   2A 00001290 pg_finfo_rum_float8_distance = pg_finfo_rum_float8_distance
         44   2B 00001260 pg_finfo_rum_float8_extract_query = pg_finfo_rum_float8_extract_query
         45   2C 00001250 pg_finfo_rum_float8_extract_value = pg_finfo_rum_float8_extract_value
         46   2D 000012D0 pg_finfo_rum_float8_key_distance = pg_finfo_rum_float8_key_distance
         47   2E 000012A0 pg_finfo_rum_float8_left_distance = pg_finfo_rum_float8_left_distance
         48   2F 000012C0 pg_finfo_rum_float8_outer_distance = pg_finfo_rum_float8_outer_distance
         49   30 000012B0 pg_finfo_rum_float8_right_distance = pg_finfo_rum_float8_right_distance
         50   31 00001630 pg_finfo_rum_inet_compare_prefix = pg_finfo_rum_inet_compare_prefix
         51   32 00001620 pg_finfo_rum_inet_extract_query = pg_finfo_rum_inet_extract_query
         52   33 00001610 pg_finfo_rum_inet_extract_value = pg_finfo_rum_inet_extract_value
         53   34 00001030 pg_finfo_rum_int2_compare_prefix = pg_finfo_rum_int2_compare_prefix
         54   35 00001040 pg_finfo_rum_int2_config = pg_finfo_rum_int2_config
         55   36 00001050 pg_finfo_rum_int2_distance = pg_finfo_rum_int2_distance
         56   37 00001020 pg_finfo_rum_int2_extract_query = pg_finfo_rum_int2_extract_query
         57   38 00001010 pg_finfo_rum_int2_extract_value = pg_finfo_rum_int2_extract_value
         58   39 00001090 pg_finfo_rum_int2_key_distance = pg_finfo_rum_int2_key_distance
         59   3A 00001060 pg_finfo_rum_int2_left_distance = pg_finfo_rum_int2_left_distance
         60   3B 00001080 pg_finfo_rum_int2_outer_distance = pg_finfo_rum_int2_outer_distance
         61   3C 00001070 pg_finfo_rum_int2_right_distance = pg_finfo_rum_int2_right_distance
         62   3D 000010C0 pg_finfo_rum_int4_compare_prefix = pg_finfo_rum_int4_compare_prefix
         63   3E 000010D0 pg_finfo_rum_int4_config = pg_finfo_rum_int4_config
         64   3F 000010E0 pg_finfo_rum_int4_distance = pg_finfo_rum_int4_distance
         65   40 000010B0 pg_finfo_rum_int4_extract_query = pg_finfo_rum_int4_extract_query
         66   41 000010A0 pg_finfo_rum_int4_extract_value = pg_finfo_rum_int4_extract_value
         67   42 00001120 pg_finfo_rum_int4_key_distance = pg_finfo_rum_int4_key_distance
         68   43 000010F0 pg_finfo_rum_int4_left_distance = pg_finfo_rum_int4_left_distance
         69   44 00001110 pg_finfo_rum_int4_outer_distance = pg_finfo_rum_int4_outer_distance
         70   45 00001100 pg_finfo_rum_int4_right_distance = pg_finfo_rum_int4_right_distance
         71   46 00001150 pg_finfo_rum_int8_compare_prefix = pg_finfo_rum_int8_compare_prefix
         72   47 00001160 pg_finfo_rum_int8_config = pg_finfo_rum_int8_config
         73   48 00001170 pg_finfo_rum_int8_distance = pg_finfo_rum_int8_distance
         74   49 00001140 pg_finfo_rum_int8_extract_query = pg_finfo_rum_int8_extract_query
         75   4A 00001130 pg_finfo_rum_int8_extract_value = pg_finfo_rum_int8_extract_value
         76   4B 000011B0 pg_finfo_rum_int8_key_distance = pg_finfo_rum_int8_key_distance
         77   4C 00001180 pg_finfo_rum_int8_left_distance = pg_finfo_rum_int8_left_distance
         78   4D 000011A0 pg_finfo_rum_int8_outer_distance = pg_finfo_rum_int8_outer_distance
         79   4E 00001190 pg_finfo_rum_int8_right_distance = pg_finfo_rum_int8_right_distance
         80   4F 000015D0 pg_finfo_rum_interval_compare_prefix = pg_finfo_rum_interval_compare_prefix
         81   50 000015C0 pg_finfo_rum_interval_extract_query = pg_finfo_rum_interval_extract_query
         82   51 000015B0 pg_finfo_rum_interval_extract_value = pg_finfo_rum_interval_extract_value
         83   52 00001600 pg_finfo_rum_macaddr_compare_prefix = pg_finfo_rum_macaddr_compare_prefix
         84   53 000015F0 pg_finfo_rum_macaddr_extract_query = pg_finfo_rum_macaddr_extract_query
         85   54 000015E0 pg_finfo_rum_macaddr_extract_value = pg_finfo_rum_macaddr_extract_value
         86   55 00001300 pg_finfo_rum_money_compare_prefix = pg_finfo_rum_money_compare_prefix
         87   56 00001310 pg_finfo_rum_money_config = pg_finfo_rum_money_config
         88   57 00001320 pg_finfo_rum_money_distance = pg_finfo_rum_money_distance
         89   58 000012F0 pg_finfo_rum_money_extract_query = pg_finfo_rum_money_extract_query
         90   59 000012E0 pg_finfo_rum_money_extract_value = pg_finfo_rum_money_extract_value
         91   5A 00001360 pg_finfo_rum_money_key_distance = pg_finfo_rum_money_key_distance
         92   5B 00001330 pg_finfo_rum_money_left_distance = pg_finfo_rum_money_left_distance
         93   5C 00001350 pg_finfo_rum_money_outer_distance = pg_finfo_rum_money_outer_distance
         94   5D 00001340 pg_finfo_rum_money_right_distance = pg_finfo_rum_money_right_distance
         95   5E 00001760 pg_finfo_rum_numeric_cmp = pg_finfo_rum_numeric_cmp
         96   5F 00001790 pg_finfo_rum_numeric_compare_prefix = pg_finfo_rum_numeric_compare_prefix
         97   60 00001780 pg_finfo_rum_numeric_extract_query = pg_finfo_rum_numeric_extract_query
         98   61 00001770 pg_finfo_rum_numeric_extract_value = pg_finfo_rum_numeric_extract_value
         99   62 00001390 pg_finfo_rum_oid_compare_prefix = pg_finfo_rum_oid_compare_prefix
        100   63 000013A0 pg_finfo_rum_oid_config = pg_finfo_rum_oid_config
        101   64 000013B0 pg_finfo_rum_oid_distance = pg_finfo_rum_oid_distance
        102   65 00001380 pg_finfo_rum_oid_extract_query = pg_finfo_rum_oid_extract_query
        103   66 00001370 pg_finfo_rum_oid_extract_value = pg_finfo_rum_oid_extract_value
        104   67 000013F0 pg_finfo_rum_oid_key_distance = pg_finfo_rum_oid_key_distance
        105   68 000013C0 pg_finfo_rum_oid_left_distance = pg_finfo_rum_oid_left_distance
        106   69 000013E0 pg_finfo_rum_oid_outer_distance = pg_finfo_rum_oid_outer_distance
        107   6A 000013D0 pg_finfo_rum_oid_right_distance = pg_finfo_rum_oid_right_distance
        108   6B 00001690 pg_finfo_rum_text_compare_prefix = pg_finfo_rum_text_compare_prefix
        109   6C 00001680 pg_finfo_rum_text_extract_query = pg_finfo_rum_text_extract_query
        110   6D 00001670 pg_finfo_rum_text_extract_value = pg_finfo_rum_text_extract_value
        111   6E 00001540 pg_finfo_rum_time_compare_prefix = pg_finfo_rum_time_compare_prefix
        112   6F 00001530 pg_finfo_rum_time_extract_query = pg_finfo_rum_time_extract_query
        113   70 00001520 pg_finfo_rum_time_extract_value = pg_finfo_rum_time_extract_value
        114   71 00001420 pg_finfo_rum_timestamp_compare_prefix = pg_finfo_rum_timestamp_compare_prefix
        115   72 00001430 pg_finfo_rum_timestamp_config = pg_finfo_rum_timestamp_config
        116   73 000017A0 pg_finfo_rum_timestamp_consistent = pg_finfo_rum_timestamp_consistent
        117   74 00001440 pg_finfo_rum_timestamp_distance = pg_finfo_rum_timestamp_distance
        118   75 00001410 pg_finfo_rum_timestamp_extract_query = pg_finfo_rum_timestamp_extract_query
        119   76 00001400 pg_finfo_rum_timestamp_extract_value = pg_finfo_rum_timestamp_extract_value
        120   77 00001480 pg_finfo_rum_timestamp_key_distance = pg_finfo_rum_timestamp_key_distance
        121   78 00001450 pg_finfo_rum_timestamp_left_distance = pg_finfo_rum_timestamp_left_distance
        122   79 00001470 pg_finfo_rum_timestamp_outer_distance = pg_finfo_rum_timestamp_outer_distance
        123   7A 00001460 pg_finfo_rum_timestamp_right_distance = pg_finfo_rum_timestamp_right_distance
        124   7B 000014B0 pg_finfo_rum_timestamptz_compare_prefix = pg_finfo_rum_timestamptz_compare_prefix
        125   7C 000014C0 pg_finfo_rum_timestamptz_config = pg_finfo_rum_timestamptz_config
        126   7D 000014D0 pg_finfo_rum_timestamptz_distance = pg_finfo_rum_timestamptz_distance
        127   7E 000014A0 pg_finfo_rum_timestamptz_extract_query = pg_finfo_rum_timestamptz_extract_query
        128   7F 00001490 pg_finfo_rum_timestamptz_extract_value = pg_finfo_rum_timestamptz_extract_value
        129   80 00001510 pg_finfo_rum_timestamptz_key_distance = pg_finfo_rum_timestamptz_key_distance
        130   81 000014E0 pg_finfo_rum_timestamptz_left_distance = pg_finfo_rum_timestamptz_left_distance
        131   82 00001500 pg_finfo_rum_timestamptz_outer_distance = pg_finfo_rum_timestamptz_outer_distance
        132   83 000014F0 pg_finfo_rum_timestamptz_right_distance = pg_finfo_rum_timestamptz_right_distance
        133   84 00001570 pg_finfo_rum_timetz_compare_prefix = pg_finfo_rum_timetz_compare_prefix
        134   85 00001560 pg_finfo_rum_timetz_extract_query = pg_finfo_rum_timetz_extract_query
        135   86 00001550 pg_finfo_rum_timetz_extract_value = pg_finfo_rum_timetz_extract_value
        136   87 00001930 pg_finfo_rum_ts_distance_td = pg_finfo_rum_ts_distance_td
        137   88 00001910 pg_finfo_rum_ts_distance_tt = pg_finfo_rum_ts_distance_tt
        138   89 00001920 pg_finfo_rum_ts_distance_ttf = pg_finfo_rum_ts_distance_ttf
        139   8A 00001970 pg_finfo_rum_ts_join_pos = pg_finfo_rum_ts_join_pos
        140   8B 00001960 pg_finfo_rum_ts_score_td = pg_finfo_rum_ts_score_td
        141   8C 00001940 pg_finfo_rum_ts_score_tt = pg_finfo_rum_ts_score_tt
        142   8D 00001950 pg_finfo_rum_ts_score_ttf = pg_finfo_rum_ts_score_ttf
        143   8E 000018E0 pg_finfo_rum_tsquery_consistent = pg_finfo_rum_tsquery_consistent
        144   8F 00001900 pg_finfo_rum_tsquery_distance = pg_finfo_rum_tsquery_distance
        145   90 000018D0 pg_finfo_rum_tsquery_pre_consistent = pg_finfo_rum_tsquery_pre_consistent
        146   91 000018F0 pg_finfo_rum_tsquery_timestamp_consistent = pg_finfo_rum_tsquery_timestamp_consistent
        147   92 000018C0 pg_finfo_rum_tsvector_config = pg_finfo_rum_tsvector_config
        148   93 00001750 pg_finfo_rum_varbit_compare_prefix = pg_finfo_rum_varbit_compare_prefix
        149   94 00001740 pg_finfo_rum_varbit_extract_query = pg_finfo_rum_varbit_extract_query
        150   95 00001730 pg_finfo_rum_varbit_extract_value = pg_finfo_rum_varbit_extract_value
        151   96 00001800 pg_finfo_rumhandler = pg_finfo_rumhandler
        152   97 000017B0 pg_finfo_ruminv_extract_tsquery = pg_finfo_ruminv_extract_tsquery
        153   98 000017C0 pg_finfo_ruminv_extract_tsvector = pg_finfo_ruminv_extract_tsvector
        154   99 000017E0 pg_finfo_ruminv_tsquery_config = pg_finfo_ruminv_tsquery_config
        155   9A 000017D0 pg_finfo_ruminv_tsvector_consistent = pg_finfo_ruminv_tsvector_consistent
        156   9B 00001980 pg_finfo_tsquery_to_distance_query = pg_finfo_tsquery_to_distance_query

  Summary

        B000 .data
        1000 .pdata
        3000 .rdata
        1000 .reloc
        2000 .text

Действительно, функции rumhandler нет, есть схожая по названию pg_finfo_rumhandler.

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

Автор: xvr 25.7.2019, 15:46
Перед всеми экспортируемыми функциями в сорцах (или в rum.h) надо написать __declspec (dllexport) (оно же PGDLLEXPORT )- это особенности билда под Win

https://askvoprosy.com/voprosy/why-does-c-name-link-symbol-of-the-specific-function-should-be-prepended-with-pg-finfo

Цитата(nnn2k @  25.7.2019,  02:48 Найти цитируемый пост)
Действительно, функции rumhandler нет, есть схожая по названию pg_finfo_rumhandler.

Должны быть обе


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)