如何从源代码将c++程序安装到conda环境中

How to install c++ program into conda environment from source

我想编译然后使用科学项目 BASS,它作为 c++ 源代码在 github 上分发。我已经设置了一个 conda 环境 bass 来保存与 BASS 相关的所有内容,我想将 BASS 编译到这个环境中(这样如果我删除环境,它就会被干净地删除)。

我不知道我是否应该使用 conda-buildmake 来执行此操作。有一个随项目分发的Makefile,但我认为它可能有错误。

我最近的尝试如下:(源文件在 code/gsl 似乎是一个依赖项):

conda create -n bass
conda activate bass
conda install make
conda install gsl
cd code/  
make

我得到以下信息:

gcc -c main.cpp -I../Libs/GSL/include/ -I./
main.cpp:19:10: fatal error: 'gsl/gsl_statistics.h' file not found
#include <gsl/gsl_statistics.h>
         ^~~~~~~~~~~~~~~~~~~~~~
1 error generated.
make: *** [Makefile:11: main.o] Error 1

我的问题:

谢谢!

根据您所写的内容,正确的方法是构建 conda 配方。通过编写配方,conda 知道删除环境时要删除的内容。

配方是一个文本文件(meta.yaml 文件),您可以在其中编写一些描述包的元数据、定义依赖项并编写一个简短的构建脚本来执行 make 文件并将二进制文件安装到正确的位置.定义编译环境可能并不简单,您应该遵循您尝试安装的包的文档。如果包代码(包括 makefile)有问题,conda 无法帮助您。

请参阅有关如何编写配方的文档: https://docs.conda.io/projects/conda-build/en/latest/concepts/recipe.html

完成食谱后,您将 运行 conda buildconda install -c [path to the build] [the package name](我写这篇文章是因为我花了很长时间才意识到如何正确安装本地包。)

这是一个非常基本的 Conda 包配方。创建一个文件夹(比如recipe)并在其中放入以下两个文件:

meta.yaml

package:
  name: bass
  version: 0.1  # this is totally arbitrary (there are no versions)

source:
  git_url: https://github.com/judyboon/BASS.git

requirements:
  build:
    - {{ compiler('cxx') }}
  host:
    - gsl
  run:
    - gsl

about:
  home: https://github.com/judyboon/BASS
  license: GPL-3.0-only
  license_file: COPYING
  license_family: GPL

build.sh

#!/bin/bash                                                                                                                                                                                                                                   

## change to source dir                                                                                                                                                                                                                       
cd ${SRC_DIR}/code

## compile                                                                                                                                                                                                                                    
${CXX} -c main.cpp *.cpp -I./ ${CXXFLAGS}

## link                                                                                                                                                                                                                                       
${CXX} *.o -o BASS -lgsl -lgslcblas -lm ${LDFLAGS}

## install                                                                                                                                                                                                                                    
mkdir -p $PREFIX/bin
cp BASS ${PREFIX}/bin/BASS

然后您可以在该目录中使用 conda build .、运行 构建它。

正在安装

成功构建后,您可以使用

创建安装此包的环境
conda create -n foo --use-local bass

由于我使用的是 Intel 架构,并且此工具使用 CBLAS,因此我将进一步指定使用 MKL:

conda create -n foo --use-local bass blas=*=*mkl

现在,如果您激活环境 foo(这是一个任意名称),该软件将位于 PATH 上,在二进制 BASS.


补充说明

我验证了这个在 osx-64 平台上的工作,conda-forge 通道优先。

代码附带的 Makefile 不是很通用。在这里,我们只是让它编译所有 .cpp 个文件,然后 link 所有 .o 个文件。

存储库中没有任何版本,因此 meta.yaml 中的版本控制是任意的。

build.sh 将最终输出二进制文件定义为 BASS - 可以更改,并且不同于将二进制文件输出为 main.

的原始 Makefile