使用MinGW / MSYS和CMake未定义引用`libintl_gettext'

我正在尝试将gettext添加到C ++项目中。 它在Linux下编译并运行良好,但是在Windows 7 64位中,MinGW32出现链接错误。 我正在用cmake -G "MSYS Makefiles" ..编译,因为MinGW不适合soe模糊的原因。 我也试过忍者。

CMakeLists.txt ,我有

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

哪一个被find

  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在行结束时移动这两个选项。