微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

[MSYS2][Windows 7][来自 Linux 的共享库端口] MSYS2 中是否有等效的 ldconfig?

如何解决[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 被本地化......

  • c:\msys64\usr\lib
  • c:\msys64\usr\share
  • c:\msys64\mingw32\lib
  • c:\msys64\mingw32\share
  • c:\msys64\mingw64\lib
  • c:\msys64\mingw64\share

与所选环境 MSYS2 MSYS 相关的内容以斜体和粗体表示。所以我将 dll 放在 /usr/lib 中,因为 *c:\msys64*chrooted

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

[编辑 4] 很忙,抱歉迟到了... 它使用 /usr/bin 中的 dll 而不是 /usr/lib。 另一方面,Windows 似乎在回显 utf8 字符时存在问题。需要调试哪里出了问题。

解决方法

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

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

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

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

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

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

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

如果你使用 MINGW64,你必须更喜欢以 mingw-w64-x86_64- 为前缀的包而不是无前缀的包:你对所有的编译器和库使用带前缀的包,而无前缀的包只用于与它无关的实用程序构建,例如 bashmakegrep - 它们没有前缀替代(嗯,Make 可以,但它很卡)。

MINGW32MINGW64 有关的文件驻留在 /mingw32/mingw64 中。与 MSYS 有关的文件驻留在 / 中。

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。