R 包:构建仅使用单线程
问题: 默认情况下,R 使用单线程编译包,这会导致构建速度变慢。
解决方案:
要并行化编译,创建或编辑~/.R/Makevars
文件,并添加如下一行:
MAKEFLAGS = -j8
上述操作将使用8个线程并行化编译。在Linux/macOS上,您可以添加以下内容以使用机器的所有线程:
MAKEFLAGS = -j$(nproc)
然而,请注意,使用的线程越多,RAM消耗就越高。如果系统在编译时耗尽RAM,那么R会话将会崩溃。
Linux AArch64上的R包:too many GOT entries
构建错误
问题: 在运行于ARM64架构(AArch64)的Linux上构建R包时,可能会出现以下错误信息:
/usr/bin/ld: /usr/include/c++/10/bits/basic_string.tcc:206:
warning: too many GOT entries for -fpic, please recompile with -fPIC
解决方案:
创建或编辑~/.R/Makevars
文件。此示例还包含并行化构建的标志:
ALL_CXXFLAGS = $(PKG_CXXFLAGS) -fPIC $(SHLIB_CXXFLAGS) $(CXXFLAGS)
MAKEFLAGS = -j$(nproc)
在进行此更改时,还应考虑使构建并行化。
Python 包: No module named 'duckdb.duckdb'
构建错误
问题: 构建Python包成功,但无法导入该包:
cd tools/pythonpkg/
python3 -m pip install .
python3 -c "import duckdb"
这将返回以下错误信息:
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/duckdb/tools/pythonpkg/duckdb/__init__.py", line 4, in <module>
import duckdb.functional as functional
File "/duckdb/tools/pythonpkg/duckdb/functional/__init__.py", line 1, in <module>
from duckdb.duckdb.functional import (
ModuleNotFoundError: No module named 'duckdb.duckdb'
解决方案:
问题是由于Python尝试从当前工作目录导入引起的。
要解决这个问题,导航到不同的目录(例如,cd ..
)并尝试再次运行Python导入。
macOS上的Python包:构建httpfs扩展失败
问题:
在macOS上,当同时包含httpfs
扩展和Python包时,构建失败:
GEN=ninja BUILD_PYTHON=1 CORE_EXTENSIONS="httpfs" make
ld: library not found for -lcrypto
clang: error: linker command failed with exit code 1 (use -v to see invocation)
error: command '/usr/bin/clang++' failed with exit code 1
ninja: build stopped: subcommand failed.
make: *** [release] Error 1
解决方案:
通常,我们推荐使用夜间构建版本,可在安装页面的GitHub主分支下获取。
如果您想从源代码构建DuckDB,除非您正在积极开发Python库,否则避免使用BUILD_PYTHON=1
标志。
相反,首先构建httpfs
扩展(如果需要),然后使用pip单独构建并安装Python包:
GEN=ninja CORE_EXTENSIONS="httpfs" make
如果下一行抱怨缺少pybind11,或者不支持--use-pep517
,请确保您使用的是最新版本的pip和setuptools。
您操作系统上的python3-pip
可能不是最新的,因此您可能需要先运行python3 -m pip install pip -U
。
python3 -m pip install tools/pythonpkg --use-pep517 --user
Linux: 构建httpfs扩展失败
问题:
在Linux上构建httpfs
扩展时,构建可能会失败,并出现以下错误。
CMake Error at /usr/share/cmake-3.22/Modules/FindPackageHandleStandardArgs.cmake:230 (message):
Could NOT find OpenSSL, try to set the path to OpenSSL root folder in the
system variable OPENSSL_ROOT_DIR (missing: OPENSSL_CRYPTO_LIBRARY
OPENSSL_INCLUDE_DIR)
解决方案:
安装 libssl-dev
库。
sudo apt-get install -y libssl-dev
然后,使用以下命令构建:
GEN=ninja CORE_EXTENSIONS="httpfs" make