首页 > 解决方案 > [MSYS2][Windows 7][Linux 的共享库端口] MSYS2 中是否有等效的 ldconfig?

问题描述

我将一个名为“uepwide”的个人图书馆用于教育目的。它包含很多功能,可以在 Linux 中享受控制台(终端)环境。当我使用所谓的 POSIX 和 UTF8 GNU 函数(与 wchar.h 相关)时,我试图通过 MSYS2 环境将它移植到 Windows 环境中(Cygwin 不起作用)。

我使用 Linux 的 makefile 并为 Windows 尝试了不同的版本......因为它已经 19 年了,我没有接触 Windows 环境以进行编程,我忘记了所有关于 dll 都在 Windows 上工作。我只是希望没有必要在 Linux 上使用的每个测试源代码中包含 __declspec(dllimport) 等内容,以检查共享库转换为 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 正在工作,但是 MSYS2/Windows 不知道 uepwide,因为这个 dll 没有像 ldconfig 在 Linux 中那样被“注册”。

我如何“注册”这个 dll ?

[编辑 1] 这是 uepwide.pc 文件:

libdir=/usr/lib
includedir=/librairies/uep_wide
Libs: -L${libdir} -luepwide -lpthread -lm
Cflags: -I${includedir}

[编辑 2] 由于 MSYS2 似乎是三合一环境(见评论),我查看了文件夹结构,发现有六个位置 pkgconfig 本地化...

与所选环境 MSYS2 MSYS 相关的那些以斜体和粗体显示。所以我把 dll 放在/usr/lib中,因为 * c:\msys64* is chrooted

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

[编辑 4] 非常忙,抱歉迟到了......它使用/usr/bin中的 dll而不是/usr/lib工作。另一方面,Windows 似乎在回显 utf8 字符方面存在问题。需要调试有什么问题。

标签: linuxgnusharedmsys2

解决方案


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

MSYS2 有三种模式。当前模式由终端中的洋红色文本指示:MSYSMINGW32MINGW64。这些模式在环境变量方面有所不同,最明显的是PATH.

这些模式具有三组相应的包,包括编译器和库。包名以前缀开头,表示它们的模式。

  • MINGW32包前缀为mingw-w64-i686-. 它们用于为 32 位 Windows 编译。
  • MINGW64包前缀为mingw-w64-x86_64-. 它们用于编译 64 位窗口。
  • MSYS包没有前缀,它们用于编译本质上是 MSYS2 自己的 Cygwin 分支。

每组包中的所有二进制文件都由相应的编译器构建。

您几乎从不想使用该MSYS模式。(如果你想要 Cygwin,你不妨使用 Cygwin 本身)。

也许你可以让它在MSYS模式下工作,但我建议切换到MINGW64. 通过使用启动 shell 来启用它mingw64.exe

如果您使用MINGW64,则必须更喜欢带有mingw-w64-x86_64-前缀的包而不是无前缀的包:您对所有编译器和库使用前缀包,而无前缀包仅用于与构建无关的实用程序,例如bash, make, grep- 它没有前缀替代品 (好吧,Make可以,但它是jank)。

属于MINGW32MINGW64驻留在/mingw32和中的文件/mingw64。与MSYS驻留在/.

所以你需要使用/mingw64/lib而不是/usr/lib.


推荐阅读