我如何将包含路径传递给 windres?

我如何将包含路径传递给 windres?

我正在尝试使用 mingw32 为 Windows 交叉编译 libiconv-1.13.1。我在 /usr/i686-w64-mingw32/bin/ 中放置了一个自定义工具链,这是用于 NetSurf 浏览器项目的。在调用 configure 之前,我已设置使用此工具链的路径:

sudo CC="/usr/i686-w64-mingw32/bin/i686-w64-mingw32-gcc -B/usr/i686-w64-mingw32/bin/i686-w64-mingw32-ld" AR="/usr/i686-w64-mingw32/bin/i686-w64-mingw32-gcc-ar" RANLIB="/usr/i686-w64-mingw32/bin/i686-w64-mingw32-gcc-ranlib" CFLAGS="-I/usr/i686-w64-mingw32/i686-w64-mingw32/include -DNO_FSEEKO" LDFLAGS="-L/usr/i686-w64-mingw32/i686-w64-mingw32/lib" ./configure --prefix=/usr/i686-w64-mingw32/ --host=i686-w64-mingw32 --disable-shared

因此配置已完成,编译已开始。包含路径显示在编译命令中,因此其设置正确。有一个涉及 windres 的步骤:

/bin/bash ../libtool --mode=compile --tag=RC i686-w64-mingw32-windres `/bin/sh ./../windows/windres-options --escape 1.13.1` -i ./../windows/libiconv.rc -o libiconv.res.lo --output-format=coff
libtool: compile:  i686-w64-mingw32-windres -DPACKAGE_VERSION_STRING=\\\"1.13.1\\\" -DPACKAGE_VERSION_MAJOR=1 -DPACKAGE_VERSION_MINOR=13 -DPACKAGE_VERSION_SUBMINOR=1 -i ./../windows/libiconv.rc --output-format=coff -o libiconv.res.o
./../windows/libiconv.rc:3:10: fatal error: winver.h: No such file or directory
    3 | #include <winver.h>
      |          ^~~~~~~~~~
compilation terminated.
i686-w64-mingw32-windres: preprocessing failed.
make[1]: *** [Makefile:93: libiconv.res.lo] Error 1

似乎在 windows/libiconv.rc 上调用 i686-w64-mingw32-windres 时未传递包含路径,包含路径 '/usr/i686-w64-mingw32/i686-w64-mingw32/include' 确实有文件 winver.h

我不熟悉如何将包含路径传递给此工具。.rc 文件旁边有一个 windres 选项文件: https://git.savannah.gnu.org/gitweb/?p=libiconv.git;a=blob;f=windows/windres-options;h=779fddec305d1e78f1e5c3123683b3c380e4a82e;hb=HEAD

也许我需要在配置脚本中改变一些内容:https://git.savannah.gnu.org/gitweb/?p=libiconv.git;a=tree;hb=HEAD

因此,任何有关此错误的帮助都将非常有帮助。谢谢。

答案1

简短警告:我是 Windows 用户,我不会乱用 ./configure 或 makefile。话虽如此,我已经弄清楚了如何手动编译它,所以这是我对此的看法。

我在自己的自动化尝试中规避此问题的方法是直接调用 WindRes,然后使用该-I <directory>标志。GCC 似乎无法很好地将包含标志传递给 WindRes,无论出于何种原因。请注意,您不能在此使用引号锁定,这是我痛苦地发现的。不过,我不确定这在基于 Linux 的操作系统上是否有什么大不了的。

要手动编译它,流程是将 .c 文件编译为对象->单独运行 WindRes->将它们链接在一起。在 Windows 上,这看起来有点像下面这样。

C:\Users\Workspace\Desktop\Compilers\mingw64\bin>gcc.exe "C:\Users\Workspace\Desktop\Sources\Win32 Experiment\src\main.c" -iquote"C:/Users/Workspace/Desktop/Sources/Win32 Experiment/includes" -c -Wall -o"C:\Users\Workspace\Desktop\Compiled\Win32 Experiment\Code.o"
C:\Users\Workspace\Desktop\Compilers\mingw64\bin>windres.exe -I C:\Users\WORKSP~1\Desktop\Sources\WIN32E~1/includes/ -v "C:\Users\Workspace\Desktop\Sources\Win32 Experiment\res\main.rc" "C:\Users\Workspace\Desktop\Compiled\Win32 Experiment\Resource.o"
C:\Users\Workspace\Desktop\Compilers\mingw64\bin>gcc.exe "C:\Users\Workspace\Desktop\Compiled\Win32 Experiment\Code.o" "C:\Users\Workspace\Desktop\Compiled\Win32 Experiment\Resource.o" -o "C:\Users\Workspace\Desktop\Compiled\Win32 Experiment\Build.exe" -ggdb -lcomctl32 -Wl,--subsystem,windows

不幸的是,我还没有找到一种智能的方法来手动将所有 .c 文件编译为单独的对象,这正是 makefile 喜欢做的事情。我想,如果可能的话,您可以简单地修改配置以仅处理 .cxx 和 .c 文件,然后将它们链接在一起。

值得庆幸的是,GCC 在链接阶段接受多个文件的通配符,因此您不需要像我一样单独定义它们。

相关内容