【发布时间】: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
[编辑 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 中,而不是lib或include。