linux - [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* 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 字符方面存在问题。需要调试有什么问题。
解决方案
您现在正在有效地使用 Cygwin。
MSYS2 有三种模式。当前模式由终端中的洋红色文本指示:MSYS
、MINGW32
或MINGW64
。这些模式在环境变量方面有所不同,最明显的是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)。
属于MINGW32
并MINGW64
驻留在/mingw32
和中的文件/mingw64
。与MSYS
驻留在/
.
所以你需要使用/mingw64/lib
而不是/usr/lib
.
推荐阅读
- c++ - 我将如何处理具有不同类的成员函数的函数查找表?
- python - 如何传输 tkinter 窗口但删除重新启动的窗口(已关闭)
- javascript - 按键名分组和聚合对象数组
- node.js - Smartsheet API 的 Node.js 查询参数
- python-3.x - 如何使索引值显示在 x 轴刻度上?
- python - 将 **kwargs 直接传递到多处理池时如何处理它们?
- javascript - Selenium / Python - 如何访问/计算具有虚拟滚动的容器内的所有元素
- reactjs - 如何使用 apollo 查询的结果调度操作?
- python - Python中的私有类变量?
- android - 无法在 Android API 23 的小屏幕上选择 DatePicker 对话框中的所有日期