【发布时间】:2021-12-01 19:30:59
【问题描述】:
我需要在 32 位和 64 位的 windows (dll) 上构建一个共享库。
编译用cmake控制,编译器是mingw64
This is my cmake file:
#64Bit Build (works fine)
ADD_LIBRARY(mylib SHARED mylib.c)
SET_TARGET_PROPERTIES(mylib PROPERTIES PREFIX "")
target_link_options(mylib PUBLIC -Wl,--exclude-all-symbols -s -Wl,--gc-sections -Wl,-Map=output.map )
#32Bit Build (linking issues)
ADD_LIBRARY(mylib32 SHARED mylib.c)
SET_TARGET_PROPERTIES(mylib32 PROPERTIES PREFIX "" COMPILE_FLAGS "-m32" LINK_FLAGS "-m32")
target_link_options(mylib32 PUBLIC --verbose -Wl,--exclude-all-symbols -s -Wl,--gc-sections -Wl,-Map=output.map)
由于许多链接库的 32 位不兼容,我在链接过程中收到很多投诉。 当我像这样专门将 32Bit 库添加到搜索路径时,我可以减少投诉量:
target_link_options(mylib32 PUBLIC --verbose -Wl,--exclude-all-symbols -s -Wl,--gc-sections -Wl,-Map=output.map -L/msys64/mingw32/lib -L/msys64/mingw32/i686-w64-mingw32/lib -L/msys64/mingw32/lib/gcc/i686-w64-mingw32/10.3.0)
但仍然存在一些不兼容问题:例如始终从 64Bit mingw 路径链接的 dllcrt.a, 这似乎有点硬编码到 gcc/ld 中。
我什至尝试使用一个空的规范字段,结果也没有:
target_link_options(mylib32 PUBLIC -specs=myspe --verbose -Wl,--exclude-all-symbols -s -Wl,--gc-sections -Wl,-Map=output.map -L/msys64/mingw32/lib -L/msys64/mingw32/i686-w64-mingw32/lib -L/msys64/mingw32/lib/gcc/i686-w64-mingw32/10.3.0)
我收到的典型错误消息:
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.3.0/../../../../x86_64-w64-mingw32/bin/ld .exe: i386:x86-64 架构的输入文件`C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.3.0/../../../.. /x86_64-w64-mingw32/lib/dllcrt2.o' 与 i386 输出不兼容
【问题讨论】:
-
您对 32 位和 64 位可执行文件使用相同的编译器吗?
-
是的,相同的编译器,
-
为什么不为 32 位可执行文件使用 32 位编译器?
-
据我所知,使用 cmake 为同一个项目维护 2 个构建环境非常复杂。使用“-m32”生成 i386 输出似乎是一个常见的用例,所以最初它看起来是一种更简单的方法。
-
如果编译器启用了
multilib,那么-m32将工作,因为32 位库也将包括在内。不确定是否还有人为 mingw 构建 multilib 编译器。
标签: cmake 32bit-64bit mingw-w64