【问题标题】:[MSYS2][Windows 7][shared library port from Linux] Is there a ldconfig equivalent in MSYS2?[MSYS2][Windows 7][Linux 的共享库端口] MSYS2 中是否有等效的 ldconfig?
【发布时间】:2021-06-19 07:08:21
【问题描述】:

我将一个名为“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 似乎是三合一环境(请参阅 cmets),我查看了文件夹结构,发现 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 字符方面存在问题。需要调试哪里出了问题。

【问题讨论】:

  • “我把 dll 放在 /usr/lib” Dll 属于 bin,而不是 lib。在 MinGW 上,至少在某个版本之前,无法直接链接到 dll。相反,编写-lfoo,除其他外,尝试链接到存根libfoo.dll.a,然后在运行时加载dll。我不会依赖直接链接到 dll,而是使用这种方法。 (因此,只有 libuepwide.dll.a 需要在(编译时)链接器搜索路径中,而不是 dll。
  • "不想将#include 更改为#include "uep_wide.h" ...我会检查 PATH 是否正确" 我的关于 PATH 的评论仅适用于 runtime dll 搜索。链接器完成的编译时搜索(和头搜索)应该不受影响。您应该只将 bin 目录保留在 PATH 中,而不是 libinclude

标签: linux gnu shared msys2


【解决方案1】:

您现在正在有效地使用 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 有,但它是 jank)。

MINGW32MINGW64 相关的文件位于/mingw32/mingw64。与MSYS 相关的文件位于/

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

【讨论】:

  • 谢谢。使用 MINGW64 编译时,找不到 termios.h。让我编译我的库的唯一“环境”是 MSYS。
  • hurukan@VirtualWin7 MINGW64 /usr/include # ls -lah termios.h -rw-r--r-- 1 hurukan None 92 Mar 17 09:17 termios.h 这是我找到的。
  • uep_wide.c:24:10: fatal error: termios.h: No such file or directory 24 | #include &lt;termios.h&gt; | ^~~~~~~~~~~ compilation terminated. make: *** [makefile:29: dllwin] Error 1 这就是我所拥有的......
  • 在 MSYS 下编译没有任何错误。
  • ...但我无法将 dll 与任何内容链接...缺少 ldconfig 等效项...
猜你喜欢
  • 2021-08-21
  • 2022-06-25
  • 2022-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多