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

时间:2021-02-02 14:51:23

标签: python c++ macos installation

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

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

这里是两个仓库:

由于无法通过 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.

接下来,按照杨玉石的建议和他对评论的关注,我根据他的回答更改了第 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 中这些行的平面 -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 和其他资源的列表:

我的问题

我该如何进行。

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

2 个答案:

答案 0 :(得分: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。

答案 1 :(得分:0)

通常是运行 batch_first = True 或将源代码下载到某个目录并运行一组命令:

brew install <your C++ package>

虽然通常可以使用,但由于维护人员没有为 Mac 准备配置,因此某些软件包无法在 Mac 上安装。