c++ - 使用 MinGW/MSYS 和 CMake 对 `libintl_gettext' 的 undefined reference

标签 c++ windows gettext mingw32 msys

我正在尝试将 gettext 添加到 C++ 项目中。它在 Linux 下编译和运行良好,但我在 Windows 7 64 位中遇到 MinGW32 的链接器错误。我正在使用 cmake -G "MSYS Makefiles".. 进行编译,因为 MinGW 不工作的原因很模糊。我也试过忍者。

CMakeLists.txt 中,我有

find_package(Gettext REQUIRED
include_directories(${GETTEXT_INCLUDE_DIR})
if (INTL_FOUND)
    find_package(INTL REQUIRED)
    include_directories(${INTL_INCLUDE_DIR})
endif()

被发现为

 GETTEXT_INCLUDE_DIR = C:/MinGW/msys/1.0/local/include

项目编译没有问题,但是在链接阶段,出现以下错误:

<source file location> undefined reference to `libintl_gettext'
<source file location> undefined reference to `libintl_setlocale'
<source file location> undefined reference to `libintl_textdomain'

等等

我看过https://www.gnu.org/software/gettext/FAQ.html#integrating_undefined

并将以下内容添加到 CMakeLists.txt:

SET(GCC_COVERAGE_COMPILE_FLAGS "-s -O2 -lintl")
SET(GCC_COVERAGE_LINK_FLAGS    "-lintl")
SET(CMAKE_CXX_FLAGS  "${CMAKE_CXX_FLAGS} ${GCC_COVERAGE_COMPILE_FLAGS}" )
SET(CMAKE_EXE_LINKER_FLAGS  "${CMAKE_EXE_LINKER_FLAGS} 

然后我试了一下

SET(GCC_COVERAGE_COMPILE_FLAGS "-s -O2 -lintl -liconv -LC:/MinGW/msys/1.0/local/lib -IC:/MinGW/msys/1.0/local/include")
SET(GCC_COVERAGE_LINK_FLAGS    "-lintl -liconv -LC:/MinGW/msys/1.0/local/lib -IC:/MinGW/msys/1.0/local/include")

这也没有用。

最佳答案

我正在使用 Win-builds 并且遇到了类似的问题。 我只是想使用 gettext 构建一个 Hello World 程序。

据我了解,这应该有效但无效:

gcc -lintl.dll -D__USE_MINGW_ANSI_STDIO -Wall -Wextra -Werror -std=gnu99 -o testGettex.exe testGettex.c

输出是:

C:\Users\Julien\AppData\Local\Temp\ccAvCaR2.o:testGettex.c:(.text+0x1a): undefined reference to `libintl_setlocale'
C:\Users\Julien\AppData\Local\Temp\ccAvCaR2.o:testGettex.c:(.text+0x2b): undefined reference to `libintl_setlocale'
C:\Users\Julien\AppData\Local\Temp\ccAvCaR2.o:testGettex.c:(.text+0x3e): undefined reference to `libintl_bindtextdomain'
C:\Users\Julien\AppData\Local\Temp\ccAvCaR2.o:testGettex.c:(.text+0x4a): undefined reference to `libintl_textdomain'
C:\Users\Julien\AppData\Local\Temp\ccAvCaR2.o:testGettex.c:(.text+0x56): undefined reference to `libintl_gettext'
C:\Users\Julien\AppData\Local\Temp\ccAvCaR2.o:testGettex.c:(.text+0x5e): undefined reference to `__printf__'
d:/prog/win-builds/bin/../lib64/gcc/x86_64-w64-mingw32/4.8.3/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\Julien\AppData\Local\Temp\ccAvCaR2.o: bad reloc address 0x0 in section `.pdata'
d:/prog/win-builds/bin/../lib64/gcc/x86_64-w64-mingw32/4.8.3/../../../../x86_64-w64-mingw32/bin/ld.exe: final link failed: Invalid operation
collect2.exe: error: ld returned 1 exit status

所以我尝试直接使用 .dll 链接,而不是使用 .dll.a,我可以用这个命令构建:

gcc -D__USE_MINGW_ANSI_STDIO -Wall -Wextra -Werror -std=gnu99 -o testGettex.exe D:\Prog\Win-builds\bin\libintl-8.dll testGettex.c

但是,我不知道您如何告诉 CMake 直接链接到 .dll...也许最好的办法是访问 MinGW 的错误跟踪器并向他们解释问题使用文件 libintl.dll.a

编辑:我刚刚阅读了您提供的链接,我看到了另一个同样有效的解决方案,将两个 -l 选项移至命令末尾

gcc -D__USE_MINGW_ANSI_STDIO -Wall -Wextra -Werror -std=gnu99 -o testGettex.exe testGettex.c -lintl.dll -liconv

也许有一种方法可以告诉 CMake 将两个选项移动到行尾。

关于c++ - 使用 MinGW/MSYS 和 CMake 对 `libintl_gettext' 的 undefined reference ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33731339/

相关文章:

c++ - Constexpr、模板和数组大小

c++ - winsock select()ing 运行时错误

客户端断开连接后,C++ TCP 服务器仍在读取数据

windows - 从上下文菜单复制路径,编辑,用编辑的文本替换剪贴板

c# - 将 WPF 应用程序作为 Windows 服务运行

windows - 批量游戏退出而不是进入下一行

java - getText() 方法不打印所有下拉值

javascript - .po 文件和 gettext VS JSON 和自定义 i18n 库?

wordpress - 为什么使用 GNU gettext?

c++ - 单字节字符代码