尝试使用 msys2 编译库时类型冲突

标签 c windows compiler-errors msys2

我正在尝试编译 wcslib在 Windows/msys2 下。
虽然这个库在 GNU/Linux 和 MacOS 上编译没有问题,但我正面临 msys2 的一个棘手问题:

wcs.h:1965:5: error: conflicting types for 'wcsset'
1965 | int wcsset(struct wcsprm *wcs);
| ^~~~~~
In file included from wcs.c:30:
C:/msys64/mingw64/x86_64-w64-mingw32/include/string.h:179:20: note: previous declaration of 'wcsset' was here
179 | wchar_t *__cdecl wcsset(wchar_t *_Str,wchar_t _Val) __MINGW_ATTRIB_DEPRECATED_MSVC2005;
| ^~~~~~
wcs.c:2185:5: error: conflicting types for 'wcsset'
2185 | int wcsset(struct wcsprm *wcs)
| ^~~~~~
In file included from wcs.c:30:
C:/msys64/mingw64/x86_64-w64-mingw32/include/string.h:179:20: note: previous declaration of 'wcsset' was here
179 | wchar_t *__cdecl wcsset(wchar_t *_Str,wchar_t _Val) __MINGW_ATTRIB_DEPRECATED_MSVC2005;
| ^~~~~~
make[3]: *** [GNUmakefile:135: libwcs-7.3.1.a(wcs.o)] Error 1
 
gcc -DHAVE_CONFIG_H -I. -I.. -g -O2 -c wcsbth.c
In file included from wcsbth.l:121: 
wcs.h:1965:5: error: conflicting types for 'wcsset'  
1965 | int wcsset(struct wcsprm *wcs);
| ^~~~~~
In file included from wcsbth.c:231:
C:/msys64/mingw64/x86_64-w64-mingw32/include/string.h:179:20: note: previous declaration of 'wcsset' was here
179 | wchar_t *__cdecl wcsset(wchar_t *_Str,wchar_t _Val) __MINGW_ATTRIB_DEPRECATED_MSVC2005;
| ^~~~~~
make[3]: *** [GNUmakefile:135: libwcs-7.3.1.a(wcsbth.o)] Error 1

gcc -DHAVE_CONFIG_H -I. -I.. -g -O2 -c wcserr.c

gcc -DHAVE_CONFIG_H -I. -I.. -g -O2 -c wcsfix.c
In file included from wcsfix.c:38:
wcs.h:1965:5: error: conflicting types for 'wcsset'
1965 | int wcsset(struct wcsprm *wcs);
| ^~~~~~
In file included from wcsfix.c:30:
C:/msys64/mingw64/x86_64-w64-mingw32/include/string.h:179:20: note: previous declaration of 'wcsset' was here
179 | wchar_t *__cdecl wcsset(wchar_t *_Str,wchar_t _Val) __MINGW_ATTRIB_DEPRECATED_MSVC2005;
| ^~~~~~
make[3]: *** [GNUmakefile:135: libwcs-7.3.1.a(wcsfix.o)] Error 1

gcc -DHAVE_CONFIG_H -I. -I.. -g -O2 -c wcshdr.c
In file included from wcshdr.h:1276,
from wcshdr.c:36:
wcs.h:1965:5: error: conflicting types for 'wcsset'
1965 | int wcsset(struct wcsprm *wcs);
| ^~~~~~
In file included from wcshdr.c:31:
C:/msys64/mingw64/x86_64-w64-mingw32/include/string.h:179:20: note: previous declaration of 'wcsset' was here
179 | wchar_t *__cdecl wcsset(wchar_t *_Str,wchar_t _Val) __MINGW_ATTRIB_DEPRECATED_MSVC2005;
| ^~~~~~
make[3]: *** [GNUmakefile:135: libwcs-7.3.1.a(wcshdr.o)] Error 1

gcc -DHAVE_CONFIG_H -I. -I.. -g -O2 -c wcspih.c
In file included from wcspih.l:123:
wcs.h:1965:5: error: conflicting types for 'wcsset'
1965 | int wcsset(struct wcsprm *wcs);
| ^~~~~~
In file included from wcspih.c:231:
C:/msys64/mingw64/x86_64-w64-mingw32/include/string.h:179:20: note: previous declaration of 'wcsset' was here
179 | wchar_t *__cdecl wcsset(wchar_t *_Str,wchar_t _Val) __MINGW_ATTRIB_DEPRECATED_MSVC2005;
| ^~~~~~
make[3]: *** [GNUmakefile:135: libwcs-7.3.1.a(wcspih.o)] Error 1

gcc -DHAVE_CONFIG_H -I. -I.. -g -O2 -c wcsprintf.c
gcc -DHAVE_CONFIG_H -I. -I.. -g -O2 -c wcstrig.c
gcc -DHAVE_CONFIG_H -I. -I.. -g -O2 -c wcsulex.c
gcc -DHAVE_CONFIG_H -I. -I.. -g -O2 -c wcsunits.c
gcc -DHAVE_CONFIG_H -I. -I.. -g -O2 -c wcsutil.c
gcc -DHAVE_CONFIG_H -I. -I.. -g -O2 -c wcsutrn.c
make[3]: Target 'libwcs-7.3.1.a' not remade because of errors.
make[2]: *** [GNUmakefile:258: lib] Error 2
make[2]: Target 'build' not remade because of errors.
make[2]: Leaving directory '/home/siril/wcslib-7.3.1/C'
Mon 2020/12/07 09:23:14 +0100, executing on
make[2]: Entering directory '/home/siril/wcslib-7.3.1/utils'
cd .. && ./config.status
config.status: creating makedefs
config.status: creating wcslib.pc
config.status: creating wcsconfig.h
config.status: creating wcsconfig_f77.h
config.status: wcsconfig_f77.h is unchanged
config.status: creating wcsconfig_tests.h
config.status: wcsconfig_tests.h is unchanged
config.status: creating wcsconfig_utils.h
 
gcc -DHAVE_CONFIG_H -I.. -I../C -g -O2 -c -o fitshdr.o fitshdr.c   
gcc -o fitshdr fitshdr.o -lm -pthread -lcurl -lm  
make[2]: Leaving directory '/home/siril/wcslib-7.3.1/utils'
make[1]: Leaving directory '/home/siril/wcslib-7.3.1'
当然,更改 lib 函数的名称不是一种选择(至少不是我的选择)。有人知道摆脱它的好选择吗?例如删除符号的方法或......其他东西。

最佳答案

我看了一下string.h错误消息中提到的文件。看起来你可以定义一个处理器宏 NO_OLDNAMES告诉头文件不要为 wcsset 生成原型(prototype).
您仍然需要在链接时注意问题,但这可能已经足够了。

关于尝试使用 msys2 编译库时类型冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65179621/

相关文章:

c++ - 编译器错误 - 没有想法

C++:编译器看不到重载的运算符

python - 如何使用参数运行python脚本?

c - 项目的内存分配和释放包装器

c - 如何调试合并排序?

c - x =!x 是什么意思?

windows - SQL Server-连接在登录过程中被强行关闭

windows - 为什么即使标签存在也会抛出 "The system cannot find the batch label specified"?

c - Arduino - 如何循环从 000000 到 FFFFFF 的十六进制颜色?

c++ - 如何在 C++ 中获取不特定于操作系统的应用程序数据/日志文件夹