[MSYS2][Windows 7][Linux共享库端口]MSYS2中有对应的ldconfig吗? [英] [MSYS2][Windows 7][shared library port from Linux] Is there a ldconfig equivalent in MSYS2?

查看:2
本文介绍了[MSYS2][Windows 7][Linux共享库端口]MSYS2中有对应的ldconfig吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用个人图书馆用于教育目的,名为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
与所选环境MSYS2 MSY相关的内容以斜体和粗体显示。因此,我将DLL放在/usr/lib中,因为*c:msys64*chroot

[编辑3] 因为我不想更改每个测试应用程序的源代码中的任何内容,所以我将遵循这样的线索:在Windows中--我忘了--DLL首先在文件夹中搜索,然后在路径中搜索。 因此,由于我不想将#Include<;uep_wide.h>;更改为#Include";uep_wide.h";(这就是我使用pkg-config的原因),我将检查路径是否正确。

[编辑4] 很忙,很抱歉来晚了。 它使用/usr/bin而不是/usr/lib中的DLL来工作。 另一方面,Windows似乎在呼应UTF8字符方面存在问题。需要调试错误的内容。

推荐答案

您现在正在有效地使用Cygwin。

MSYS2有三种模式。当前模式由终端中的洋红色文本表示:MSYSMINGW32MINGW64。这些模式在环境变量上有所不同,最显著的是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-为前缀的包,而不是无前缀的包:您为所有编译器和库使用前缀包,而将无前缀的包仅用于与构建无关的实用程序,如bashmakegrep--它们没有前缀替代选项(嗯,make可以,但它是jank)。

MINGW32MINGW64有关的文件位于/mingw32/mingw64中。属于MSYS的文件驻留在/中。

因此您需要使用/mingw64/lib而不是/usr/lib

这篇关于[MSYS2][Windows 7][Linux共享库端口]MSYS2中有对应的ldconfig吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆