如何从源代码将c++程序安装到conda环境中
How to install c++ program into conda environment from source
我想编译然后使用科学项目 BASS,它作为 c++ 源代码在 github 上分发。我已经设置了一个 conda 环境 bass
来保存与 BASS 相关的所有内容,我想将 BASS 编译到这个环境中(这样如果我删除环境,它就会被干净地删除)。
我不知道我是否应该使用 conda-build
或 make
来执行此操作。有一个随项目分发的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
我的问题:
- 我应该用 make 做这个吗?
- 我需要在我的 conda 环境中安装 gcc/g++/cxx-compiler 吗?
- Makefile 中写着“
-I../Libs/GSL/include/
”的地方是否正确
谢谢!
根据您所写的内容,正确的方法是构建 conda 配方。通过编写配方,conda
知道删除环境时要删除的内容。
配方是一个文本文件(meta.yaml
文件),您可以在其中编写一些描述包的元数据、定义依赖项并编写一个简短的构建脚本来执行 make 文件并将二进制文件安装到正确的位置.定义编译环境可能并不简单,您应该遵循您尝试安装的包的文档。如果包代码(包括 makefile)有问题,conda 无法帮助您。
请参阅有关如何编写配方的文档:
https://docs.conda.io/projects/conda-build/en/latest/concepts/recipe.html
完成食谱后,您将 运行 conda build
和 conda 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
我想编译然后使用科学项目 BASS,它作为 c++ 源代码在 github 上分发。我已经设置了一个 conda 环境 bass
来保存与 BASS 相关的所有内容,我想将 BASS 编译到这个环境中(这样如果我删除环境,它就会被干净地删除)。
我不知道我是否应该使用 conda-build
或 make
来执行此操作。有一个随项目分发的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
我的问题:
- 我应该用 make 做这个吗?
- 我需要在我的 conda 环境中安装 gcc/g++/cxx-compiler 吗?
- Makefile 中写着“
-I../Libs/GSL/include/
”的地方是否正确
谢谢!
根据您所写的内容,正确的方法是构建 conda 配方。通过编写配方,conda
知道删除环境时要删除的内容。
配方是一个文本文件(meta.yaml
文件),您可以在其中编写一些描述包的元数据、定义依赖项并编写一个简短的构建脚本来执行 make 文件并将二进制文件安装到正确的位置.定义编译环境可能并不简单,您应该遵循您尝试安装的包的文档。如果包代码(包括 makefile)有问题,conda 无法帮助您。
请参阅有关如何编写配方的文档: https://docs.conda.io/projects/conda-build/en/latest/concepts/recipe.html
完成食谱后,您将 运行 conda build
和 conda 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
.