[MSYS2][Windows 7][Linux共享库端口]MSYS2中有对应的ldconfig吗? [英] [MSYS2][Windows 7][shared library port from Linux] Is there a ldconfig equivalent in MSYS2?
问题描述
我使用个人图书馆用于教育目的,名为uepwide&。 它包含许多函数来享受Linux中的控制台(终端)环境。 当我使用预期的可移植&称为POSIX和UTF8 GNU函数(wchar.h相关)时,我尝试通过MSYS2环境(Cygwin不起作用)将其移植到Windows环境中。
我使用了来自Linux的Makefile,并尝试了Windows的不同版本...因为现在已经19年了,我没有接触过Windows环境的编程目的,我已经忘记了所有关于DLL都在Windows上工作的事情。我只是希望没有必要包括像__declspec(Dllimport)之类的东西。在Linux上使用的每一个测试源代码,检查是否一切正常,把共享库变成了DLL。这是我使用的生成文件(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正在工作,但MSYS2/Windows不知道uepwide,因为此DLL没有像在Linux中那样注册。
如何注册此DLL(&Q;)?
[编辑1] 这是uepwide.pc文件:
libdir=/usr/lib
includedir=/librairies/uep_wide
Libs: -L${libdir} -luepwide -lpthread -lm
Cflags: -I${includedir}
[编辑2] 由于MSYS2似乎是一个三合一的环境(请参阅评论),我查看了文件夹结构,发现有六个位置放置了pkgconfig...
- c:msys64usrlib
- c:msys64usrshare
- c:msys64mingw32lib
- c:msys64mingw32share
- c:msys64mingw64lib
- c:msys64mingw64share
[编辑3] 因为我不想更改每个测试应用程序的源代码中的任何内容,所以我将遵循这样的线索:在Windows中--我忘了--DLL首先在文件夹中搜索,然后在路径中搜索。 因此,由于我不想将#Include<;uep_wide.h>;更改为#Include";uep_wide.h";(这就是我使用pkg-config的原因),我将检查路径是否正确。
[编辑4] 很忙,很抱歉来晚了。 它使用/usr/bin而不是/usr/lib中的DLL来工作。 另一方面,Windows似乎在呼应UTF8字符方面存在问题。需要调试错误的内容。
推荐答案
您现在正在有效地使用Cygwin。
MSYS2有三种模式。当前模式由终端中的洋红色文本表示:MSYS
、MINGW32
或MINGW64
。这些模式在环境变量上有所不同,最显著的是PATH
。
这些模式有三组相应的包,包括编译器和库。包名称以前缀开头,表示其模式。
MINGW32
包以mingw-w64-i686-
为前缀。它们用于针对32位Windows进行编译。MINGW64
包以mingw-w64-x86_64-
为前缀。它们用于编译64位Windows。MSYS
包是无前缀的,它们用于编译实质上是MSYS2自己的Cygwin分支。
每组程序包中的所有二进制文件都由相应的编译器生成。
您几乎从不想使用MSYS
模式。(如果您想要Cygwin,不妨使用Cygwin本身)。
也许您可以让它在MSYS
模式下工作,但我建议切换到MINGW64
模式。通过使用mingw64.exe
启动外壳程序来启用它。
如果您使用MINGW64
,您必须首选以mingw-w64-x86_64-
为前缀的包,而不是无前缀的包:您为所有编译器和库使用前缀包,而将无前缀的包仅用于与构建无关的实用程序,如bash
、make
、grep
--它们没有前缀替代选项(嗯,make可以,但它是jank)。
MINGW32
和MINGW64
有关的文件位于/mingw32
和/mingw64
中。属于MSYS
的文件驻留在/
中。
因此您需要使用/mingw64/lib
而不是/usr/lib
。
这篇关于[MSYS2][Windows 7][Linux共享库端口]MSYS2中有对应的ldconfig吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!