Gun*_*eoc 6 c++ windows gettext msys mingw32
我正在尝试将 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()
Run Code Online (Sandbox Code Playgroud)
发现如下
GETTEXT_INCLUDE_DIR = C:/MinGW/msys/1.0/local/include
Run Code Online (Sandbox Code Playgroud)
该项目编译没有问题,但在链接阶段,我收到以下错误:
<source file location> undefined reference to `libintl_gettext'
<source file location> undefined reference to `libintl_setlocale'
<source file location> undefined reference to `libintl_textdomain'
Run Code Online (Sandbox Code Playgroud)
ETC。
我查看了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}
Run Code Online (Sandbox Code Playgroud)
然后我尝试了
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")
Run Code Online (Sandbox Code Playgroud)
这也不起作用。
我正在使用 Win-builds,并且遇到了类似的问题。我只是想使用 gettext 构建一个 Hello World 程序。
据我了解,这应该有效,但无效:
gcc -lintl.dll -D__USE_MINGW_ANSI_STDIO -Wall -Wextra -Werror -std=gnu99 -o testGettex.exe testGettex.c
Run Code Online (Sandbox Code Playgroud)
输出是:
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
Run Code Online (Sandbox Code Playgroud)
所以我尝试直接使用.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
Run Code Online (Sandbox Code Playgroud)
但是,我不知道如何告诉 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
Run Code Online (Sandbox Code Playgroud)
也许有一种方法可以告诉 CMake 将两个选项移到行尾。
| 归档时间: |
|
| 查看次数: |
3801 次 |
| 最近记录: |