Cygwin下的gcc 9.3.0预处理器:cmdline -Dname,但名称似乎未定义
gcc 9.3.0 preprocessor under Cygwin: cmdline -Dname but name seems to be undefined
我正在尝试在Cygwin下构建OCRmyPDF,但遇到了一块砖头 墙。 虽然我的整个职业生涯都是开发人员,但我一直在工作 主要使用Java,对Python内部和C++知之甚少。 对于这些领域的专家来说,问题可能很明显,但我是 难倒。
Linux 上的 OCRmyPDF 作为一组"轮子"包安装。 我收集一个 wheel 是预先构建的依赖项捆绑包。 出于某种原因,在 Pip 安装人员 Cygwin 认为它不能使用车轮束并希望 从源重建。尝试重建 派克PDF包。
这是错误:
building 'pikepdf._qpdf' extension
creating build/temp.cygwin-3.1.4-x86_64-3.7
creating build/temp.cygwin-3.1.4-x86_64-3.7/src
creating build/temp.cygwin-3.1.4-x86_64-3.7/src/qpdf
gcc -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -ggdb -O2 -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fstack-protector-strong --param=ssp-buffer-size=4 -fdebug-prefix-map=/cygdrive/d/cyg_pub/devel/python/python37/python37-3.7.7-1.x86_64/build=/usr/src/debug/python37-3.7.7-1 -fdebug-prefix-map=/cygdrive/d/cyg_pub/devel/python/python37/python37-3.7.7-1.x86_64/src/Python-3.7.7=/usr/src/debug/python37-3.7.7-1 -ggdb -O2 -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fstack-protector-strong --param=ssp-buffer-size=4 -fdebug-prefix-map=/cygdrive/d/cyg_pub/devel/python/python37/python37-3.7.7-1.x86_64/build=/usr/src/debug/python37-3.7.7-1 -fdebug-prefix-map=/cygdrive/d/cyg_pub/devel/python/python37/python37-3.7.7-1.x86_64/src/Python-3.7.7=/usr/src/debug/python37-3.7.7-1 -D__MISC_VISIBLE=1 -I/tmp/pip-build-env-fdjj5aaz/overlay/lib/python3.7/site-packages/pybind11/include -I/tmp/pip-build-env-fdjj5aaz/overlay/lib/python3.7/site-packages/pybind11/include -I/usr/include/python3.7m -c src/qpdf/annotation.cpp -o build/temp.cygwin-3.1.4-x86_64-3.7/src/qpdf/annotation.o -DVERSION_INFO="1.11.2" -std=c++14 -fvisibility=hidden
In file included from src/qpdf/annotation.cpp:18:
/tmp/pip-build-env-fdjj5aaz/overlay/lib/python3.7/site-packages/pybind11/include/pybind11/pybind11.h: In member function ‘void pybind11::cpp_function::initialize_generic(pybind11::detail::function_record*, const char*, const std::type_info* const*, pybind11::size_t)’:
/tmp/pip-build-env-fdjj5aaz/overlay/lib/python3.7/site-packages/pybind11/include/pybind11/pybind11.h:197:21: error: ‘strdup’ was not declared in this scope; did you mean ‘strcmp’?
197 | rec->name = strdup(rec->name ? rec->name : "");
| ^~~~~~
| strcmp
In file included from src/qpdf/annotation.cpp:18:
/tmp/pip-build-env-fdjj5aaz/overlay/lib/python3.7/site-packages/pybind11/include/pybind11/pybind11.h: In member function ‘pybind11::class_<type_, options>& pybind11::class_<type_, options>::def_property_static(const char*, const pybind11::cpp_function&, const pybind11::cpp_function&, const Extra& ...)’:
/tmp/pip-build-env-fdjj5aaz/overlay/lib/python3.7/site-packages/pybind11/include/pybind11/pybind11.h:1284:31: error: there are no arguments to ‘strdup’ that depend on a template parameter, so a declaration of ‘strdup’ must be available [-fpermissive]
1284 | rec_fget->doc = strdup(rec_fget->doc);
| ^~~~~~
/tmp/pip-build-env-fdjj5aaz/overlay/lib/python3.7/site-packages/pybind11/include/pybind11/pybind11.h:1284:31: note: (if you use ‘-fpermissive’, G++ will accept your code, but allowing the use of an undeclared name is deprecated)
/tmp/pip-build-env-fdjj5aaz/overlay/lib/python3.7/site-packages/pybind11/include/pybind11/pybind11.h:1292:33: error: there are no arguments to ‘strdup’ that depend on a template parameter, so a declaration of ‘strdup’ must be available [-fpermissive]
1292 | rec_fset->doc = strdup(rec_fset->doc);
| ^~~~~~
/tmp/pip-build-env-fdjj5aaz/overlay/lib/python3.7/site-packages/pybind11/include/pybind11/pybind11.h: In instantiation of ‘pybind11::class_<type_, options>& pybind11::class_<type_, options>::def_property_static(const char*, const pybind11::cpp_function&, const pybind11::cpp_function&, const Extra& ...) [with Extra = {pybind11::is_method, pybind11::return_value_policy}; type_ = QPDFAnnotationObjectHelper; options = {}]’:
/tmp/pip-build-env-fdjj5aaz/overlay/lib/python3.7/site-packages/pybind11/include/pybind11/pybind11.h:1263:80: required from ‘pybind11::class_<type_, options>& pybind11::class_<type_, options>::def_property(const char*, const pybind11::cpp_function&, const pybind11::cpp_function&, const Extra& ...) [with Extra = {pybind11::return_value_policy}; type_ = QPDFAnnotationObjectHelper; options = {}]’
/tmp/pip-build-env-fdjj5aaz/overlay/lib/python3.7/site-packages/pybind11/include/pybind11/pybind11.h:1252:91: required from ‘pybind11::class_<type_, options>& pybind11::class_<type_, options>::def_property(const char*, const Getter&, const Setter&, const Extra& ...) [with Getter = pybind11::cpp_function; Setter = std::nullptr_t; Extra = {pybind11::return_value_policy}; type_ = QPDFAnnotationObjectHelper; options = {}]’
/tmp/pip-build-env-fdjj5aaz/overlay/lib/python3.7/site-packages/pybind11/include/pybind11/pybind11.h:1234:58: required from ‘pybind11::class_<type_, options>& pybind11::class_<type_, options>::def_property_readonly(const char*, const pybind11::cpp_function&, const Extra& ...) [with Extra = {pybind11::return_value_policy}; type_ = QPDFAnnotationObjectHelper; options = {}]’
/tmp/pip-build-env-fdjj5aaz/overlay/lib/python3.7/site-packages/pybind11/include/pybind11/pybind11.h:1228:87: required from ‘pybind11::class_<type_, options>& pybind11::class_<type_, options>::def_property_readonly(const char*, const Getter&, const Extra& ...) [with Getter = std::basic_string<char> (QPDFAnnotationObjectHelper::*)(); Extra = {}; type_ = QPDFAnnotationObjectHelper; options = {}]’
src/qpdf/annotation.cpp:28:82: required from here
/tmp/pip-build-env-fdjj5aaz/overlay/lib/python3.7/site-packages/pybind11/include/pybind11/pybind11.h:1284:37: error: ‘strdup’ was not declared in this scope; did you mean ‘strcmp’?
1284 | rec_fget->doc = strdup(rec_fget->doc);
| ~~~~~~^~~~~~~~~~~~~~~
| strcmp
/tmp/pip-build-env-fdjj5aaz/overlay/lib/python3.7/site-packages/pybind11/include/pybind11/pybind11.h:1292:39: error: ‘strdup’ was not declared in this scope; did you mean ‘strcmp’?
1292 | rec_fset->doc = strdup(rec_fset->doc);
| ~~~~~~^~~~~~~~~~~~~~~
| strcmp
error: command 'gcc' failed with exit status 1
----------------------------------------
ERROR: Failed building wheel for pikepdf
Failed to build pikepdf
ERROR: Could not build wheels for pikepdf which use PEP 517 and cannot be installed directly
所以看起来pybind11.h
需要strdup()
但它不可用。strdup()
在/usr/include/string.h
中声明,其中包含 这:
#if __MISC_VISIBLE || __POSIX_VISIBLE >= 200809 || __XSI_VISIBLE >= 4
char *strdup (const char *) __malloc_like __result_use_check;
#endif
char *_strdup_r (struct _reent *, const char *);
#if __POSIX_VISIBLE >= 200809
char *strndup (const char *, size_t) __malloc_like __result_use_check;
#endif
所以我尝试在命令行中添加显式-D__MISC_VISIBLE
看看这是否可以解决问题,但它不起作用(如上所示(。 我捕获了 带有-E
的预处理器输出,并发现即使使用-D__MISC_VISIBLE
它的行为也好像没有定义该宏一样。仅显示_strdup_r
:
Preprocessor output snippet
# 86 "/usr/include/string.h" 3 4
char *_strdup_r (struct _reent *, const char *);
这就是我卡住的地方。 我似乎无法制作编译器 包括strdup()
. 我不确定下一步该如何进行,欢迎 任何建议。
strdup 是标准 C 的扩展。
Cygwin标头比其他系统更严格 并报告范围
/usr/include/sys/features.h
常用解决方案:
- 将
-std=c++11
替换为-std=gnu++11
- 完全删除
-std=xxx
- 使用
-D_GNU_SOURCE
最后两个或多或少是等效的,因为默认范围是最大的,并且-std=xxx
减少它。
相关文章:
- 编译C++时未定义的引用
- vscode g++链路故障:体系结构x86_64的未定义符号
- 如何修复此错误:未定义对"距离(浮点数,浮点数,浮点数,浮点数,浮点数)"的引用
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- 不知道某个东西是否被忽略会引入未定义的行为吗
- 对C宏的未定义引用,但在定义它时会出现重新定义错误
- 未定义的引用在哪里
- 编译时的 CImg 库返回对"__imp_SetDIBitsToDevice"的未定义引用
- 对Py_Initialize()的未定义引用
- c++11评估顺序(未定义的行为)
- 使用mysql c++连接器的未定义引用
- 从python调用openMP共享库时,未定义opnMP函数
- 在 Mac 上使用 CMAKE 将 FFTW 和 FFTWPP 链接到项目中时未定义的符号
- Cmake 链接问题:未定义对 Button::mousePressEvent(QGraphicsSceneMouseE
- 未定义的引用 .. 使用 OpenCV 编译 C++ 代码时,从命令行
- 具有外部"c"和程序集的未定义函数
- 此增量后语句是否会导致未定义的行为?
- 尝试调用 .h 文件中定义的变量时出现变量未定义错误
- 在C++中使用内联方法时出现未定义的符号错误
- Cygwin下的gcc 9.3.0预处理器:cmdline -Dname,但名称似乎未定义