В образовательных целях я использую личную библиотеку под названием uepwide. Он содержит множество функций для использования консольной (терминальной) среды в Linux. Поскольку я использую то, что, как ожидается, будет переносимым, называемым функциями POSIX и UTF8 GNU (связанными с wchar.h), я попытался перенести его в среду Windows через среду MSYS2 (Cygwin не работает).
Я использую make-файл из Linux и пробовал другую версию для Windows... так как уже 19 лет я не прикасаюсь к среде Windows для целей программирования, я забыл все, что касается dll, которые работают в Windows. Я просто надеюсь, что нет необходимости включать такие вещи, как __declspec(dllimport) и т.д... в каждый тестовый исходный код, используемый в Linux, чтобы проверить, все ли в порядке с общей библиотекой, превращенной в dll.
Вот makefile (часть Windows), который я использовал:
dllwin: uep_wide.c uep_wide.h setElementEx.c getElementEx.c
@echo "Librairie partagée compilée..."
@echo "...installation au niveau du système d'exploitation !!"
gcc -c -fPIC -O3 uep_wide.c -o libuepwide.o
@echo "...compilation des add-ons..."
gcc -c -fPIC -O3 setElementEx.c -o setElementEx.o
gcc -c -fPIC -O3 getElementEx.c -o getElementEx.o
gcc -c -fPIC -O3 getPIDByName.c -o getPIDByName.o
@echo "...compilation de la librairie..."
gcc -shared -Wall libuepwide.o setElementEx.o getElementEx.o getPIDByName.o -lpthread -lm -o uepwide.dll
@cp uepwide.dll /usr/lib
@echo "TERMINE"
Поскольку в MSYS2 нет папки lib64 (почему?), то я поместил ее в /usr/lib. Когда я компилирую свой тестовый код, пытаясь использовать эту dll...
CFLAGS=`pkg-config uepwide linkedlist --cflags`
LDFLAGS=`pkg-config uepwide linkedlist --libs`
test1: test1.c
test2: test2.c
test3: test3.c
test4: test4.c
...
Я получил эту ошибку от компоновщика...
cc `pkg-config uepwide --cflags` `pkg-config uepwide --libs` test1.c -o test1
/usr/lib/gcc/x86_64-pc-msys/10.2.0/../../../../x86_64-pc-msys/bin/ld: cannot find -luepwide
collect2: error: ld returned 1 exit status
make: *** [<builtin>: test1] Error 1
Это показывает, что pkg-config работает, но uepwide неизвестен MSYS2/Windows, потому что эта dll не была зарегистрирована, как это делает ldconfig в Linux.
Как зарегистрировать эту dll?
[EDIT 1] Это файл uepwide.pc:
libdir=/usr/lib
includedir=/librairies/uep_wide
Libs: -L${libdir} -luepwide -lpthread -lm
Cflags: -I${includedir}
[РЕДАКТИРОВАТЬ 2] Поскольку MSYS2 кажется средой "три в одном" (см. комментарии), я просмотрел структуру папок и увидел, что существует шесть мест, где локализован pkgconfig...
- c:\msys64\usr\lib
- c:\msys64\usr\share
- c:\msys64\mingw32\lib
- c:\msys64\mingw32\общий доступ
- c:\msys64\mingw64\lib
- c:\msys64\mingw64\общий доступ
Те, которые относятся к выбранной среде MSYS2 MSYS, выделены курсивом и полужирным шрифтом. Поэтому я поместил dll в /usr/lib, так как *c:\msys64* chrooted.
[EDIT 3] Поскольку я не хочу ничего менять в исходном коде для каждого тестового приложения, я буду следовать подсказке, указывающей, что в Windows - я забыл - dll сначала ищутся в папке, а затем в PATH. Так как я не хочу менять #include ‹uep_wide.h› на #include uep_wide.h (именно поэтому я использую pkg-config), я проверю правильность PATH.
[EDIT 4] Очень занят, извините за опоздание... Он работает с использованием dll в /usr/bin вместо /usr/lib. С другой стороны, у Windows, похоже, есть проблемы с повторением символов utf8. Нужно отладить, что не так.
bin
, а неlib
. На MinGW, по крайней мере до определенной версии, нельзя было напрямую ссылаться на dll. Вместо этого запись-lfoo
, среди прочего, пытается связать заглушкуlibfoo.dll.a
, которая затем загружает dll во время выполнения. Я бы не стал полагаться на прямое связывание с dll и вместо этого использовал этот метод. (Таким образом, толькоlibuepwide.dll.a
должен быть в пути поиска компоновщика (во время компиляции), а не в dll. - person HolyBlackCat   schedule 24.03.2021bin
в PATH, а неlib
илиinclude
. - person HolyBlackCat   schedule 24.03.2021