如何在 Mac OS 上为 Python 包“从源代码”安装 C++ 依赖项?

Posted

技术标签:

【中文标题】如何在 Mac OS 上为 Python 包“从源代码”安装 C++ 依赖项?【英文标题】:How to install C++ dependencies "from source" for a Python package on Mac OS? 【发布时间】:2021-02-02 14:51:23 【问题描述】:

有一个 Github 存储库,其中包含我有兴趣使用的 C++ 库的 Python“绑定”。 README 中有大量关于如何在类似 Linux 的机器上安装 C++ 库的信息,但没有关于如何在 mac OS 上安装的信息。

我还提出了一个问题,要求 README 安装说明除了 linux 之外还包括特定于 mac OS 的安装。没有关于该问题的任何活动。

这是两个 repos:

(Python)https://github.com/asiffer/python3-libspot (C++)https://github.com/asiffer/libspot

由于无法通过 Brew/pip/anaconda 安装 C++ 包,因此我不知道如何开始。

我的尝试:

我尝试过./configuremake。没有./configure 文件。

要解决./configure 的缺失问题,请阅读一个名为autoconf 的工具,它可以为您生成./configure。我用brew 安装它,但不确定要传递什么参数。这些文档很难理解:https://www.gnu.org/software/autoconf/manual/autoconf-2.67/html_node/Making-configure-Scripts.html

仅使用 make 会导致错误叮当声:error: unsupported option '-fopenmp'这让我陷入了一个完全不同的兔子洞,这让我在 Makefile 中添加了行:

CPP = /usr/local/opt/llvm/bin/clang
CPPFLAGS = -I/usr/local/opt/llvm/include -fopenmp
LDFLAGS = -L/usr/local/opt/llvm/lib

omp_hello: omp_hello.c
    $(CPP) $(CPPFLAGS) $^ -o $@ $(LDFLAGS)

那感觉很危险,因为我不知道这些东西是什么意思。另外它导致了一个新错误:*** missing separator. Stop.

然后我读到这可能是由于使用“软”标签而不是可以使用cat -e -t -v makefile_name 识别的“硬”标签。我找到了缺少“硬”标签的一行(上面的缩进行)并将其插入。这导致了一个新错误:

make: *** No rule to make target `omp_hello.c', needed by `omp_hello'.  Stop.

接下来,在杨玉石和他对 cme​​ts 的建议下,我根据他的回答更改了第 39 行和第 40 行,并在CXXFLAGS 变量中添加了一些额外文件的位置:

-I//opt/homebrew/Cellar/libomp/11.0.1/include 
-L/opt/homebrew/Cellar/libomp/11.0.1/lib

这让我更进一步。接下来,正如this answer 所解释的那样,OSX 不喜欢这个脚本试图安装的位置。所以我在 makefile 中更改了这两行,这似乎决定了安装位置:

INSTALL_HEAD_DIR = $(DESTDIR)/usr/include/libspot
INSTALL_LIB_DIR = $(DESTDIR)/usr/lib

INSTALL_HEAD_DIR = $(DESTDIR)/usr/local/include/libspot
INSTALL_LIB_DIR = $(DESTDIR)/usr/local/lib

这确实让我走得更远。接下来我遇到了一个错误,在 makefile 的这些行中抱怨 flat -t

@install -t $(INSTALL_LIB_DIR) $(LIB_DIR)/*.so
@install -t $(INSTALL_HEAD_DIR) $(INC_DIR)/*.h

所以我删除了那些标志,然后导致了这个错误:

Checking the headers installation directory (/usr/local/include/libspot)
Checking the library installation directory (/usr/local/lib)
Installing the shared library (libspot.so)
install: /usr/local/lib: Inappropriate file type or format

我找不到任何阅读材料,也不知道如何解决。任何进一步的帮助表示赞赏。

以下是我为回答这个问题而仔细阅读过的 SO 和其他资源的列表:

Enable OpenMP support in clang in Mac OS X (sierra & Mojave) makefile error: make: *** No rule to make target `omp.h' ; with OpenMP makefile:4: *** missing separator. Stop http://www.idryman.org/blog/2016/03/10/autoconf-tutorial-1/ https://www.gnu.org/software/autoconf/manual/autoconf-2.67/html_node/Making-configure-Scripts.html https://developer.gnome.org/anjuta-build-tutorial/stable/create-autotools.html.en

我的问题

我该如何进行。

如果您知道如何执行此操作,能否还简要说明每个步骤背后的概念?我很乐意学习一点,而不仅仅是按正确的顺序复制和粘贴命令。

【问题讨论】:

【参考方案1】:

使用 Apple Clang 编译 C++ 源代码

我下载了prjoect (libspot) 并在我的Mac 上成功编译了它。我更改了 Makefile 中的两行(39 和 40)以使其工作。 (关注this answer)

CC = clang++  # change from g++ to default Apple clang
CXXFLAGS = -std=c++11 -Wall -pedantic -Xpreprocessor -fopenmp  -lomp  # additional flags

您应该通过键入带有“正确”Makefile 的make 来获取二进制文件。

(如果您看到类似“找不到 omp.h”的内容,请将 -I/usr/local/opt/libomp/include 添加到 CXXFLAGS。)


问题

更新问题描述中的错误信息

make: *** 没有规则可以创建目标 omp_hello.c', needed by omp_hello'。停下来。

告诉我们文件omp_hello.c 丢失。编写 Makefile 以将源代码 omp_hello.c 编译为可执行二进制文件 omp_hello。如果我有 C 源文件 (omp_hello.c),Makefile 将允许我只需键入即可编译

make

而不是

/usr/local/opt/llvm/bin/clang \
-I/usr/local/opt/llvm/include -fopenmp \
-L/usr/local/opt/llvm/lib \
omp_hello.c -o omp_hello

这只是一个正常的编译过程,与Python无关。错误信息是说缺少要编译的源代码(omp_hello.c)。


看起来这是一个带有自定义 Makefile 的小项目。通常你只用make 编译代码。您得到的错误似乎表明缺少 llvm。您可能想尝试在this answer 之后安装 llvm。

【讨论】:

谢谢,但我确定我已经安装了llvm 以及libomp。我已经看到了那个答案。 也许尝试将CPP = /usr/local/opt/llvm/bin/clang更改为CPP = /usr/local/opt/llvm/bin/clang++ 不幸的是,这仍然给我留下了 omp_hello'. Stop. 需要的 *** No rule to make target omp_hello.c' 抱歉,您没有omp_hello.c 文件。您看到当前文件夹中的文件了吗? (这实际上是一个 C 文件而不是 C++,所以也许你想将 CPP 改回 CPP = /usr/local/opt/llvm/bin/clan...) 添加到最后,类似CXXFLAGS = -std=c++11 -Wall -pedantic -Xpreprocessor -fopenmp -lomp -I/usr/local/opt/libomp/include【参考方案2】:

通常是运行brew install <your C++ package>或将源代码下载到某个目录并运行一组命令:

./configure
make
make install

虽然通常可以正常工作,但某些软件包无法安装在 Mac 上,因为它们的维护者没有为 Mac 准备配置。

【讨论】:

我从 GitHub 克隆的 repo 中没有 ./configure 文件。我尝试只使用make,但得到了clang: error: unsupported option '-fopenmp' 如果第一次失败,我建议走其他路。尝试将 Linux 安装为 VM。它可能会更快。

以上是关于如何在 Mac OS 上为 Python 包“从源代码”安装 C++ 依赖项?的主要内容,如果未能解决你的问题,请参考以下文章

在 Mac OS X Sierra 上为 Django Python 安装 mysqlclient

如何在 Mac OS X 主机上为 MIPS 目标构建 GCC 4.8.x

在 Mac OS X 10.5.8 上为 PHP 安装 Mcrypt 扩展

如何在 mac os x (10.9) 上的 python 中安装 libgpuarray 和 clBLAS?

有没有人设法在 Mac OS X Leopard 上为 apache 编译 mod_wsgi?

如何使用自制软件在 Mac OS X 上安装 GTest?