首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Mac上的中安装pygit2 2/libgit2 2

在Mac上的中安装pygit2 2/libgit2 2
EN

Stack Overflow用户
提问于 2013-05-15 16:20:37
回答 4查看 2.6K关注 0票数 3

我想我快疯了。我只想在macbook上的python中安装pygit2,这样我就可以开始工作了。然而,这并没有动摇,我一整天都在尝试设置它。

我应该按照下面的指示:

http://www.pygit2.org/install.html#how-to-install

我已经尝试了无数的东西,与rpath混在一起,因为显然在macs上,这是不同的实现方式:

如何在Mac下与gcc一起设置可执行文件的运行时路径(-rpath)?

..。还有无数的其他变体,我只是在这一点上猜测,但是每次我试图构建pygit2时,它总是会导致这样的结果:

代码语言:javascript
复制
(testenv)emil ~/sites/env/testenv/pygit2 > which python
/Users/emil/Sites/env/testenv/bin/python
(testenv)emil ~/sites/env/testenv/pygit2 > python -c 'import pygit2'
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "pygit2/__init__.py", line 32, in <module>
    import _pygit2
ImportError: dlopen(/Users/emil/sites/env/testenv/lib/python2.7/site-packages/_pygit2.so, 2): Symbol not found: _git_remote_fetchspec
  Referenced from: /Users/emil/sites/env/testenv/lib/python2.7/site-packages/_pygit2.so
  Expected in: flat namespace
 in /Users/emil/sites/env/testenv/lib/python2.7/site-packages/_pygit2.so

它似乎没有正确地连接库:

代码语言:javascript
复制
(testenv)emil ~/sites/env/testenv/pygit2 > nm /Users/emil/sites/env/testenv/lib/python2.7/site-packages/_pygit2.so | grep _git | less

000000000000626c T _Repository_git_object_lookup_prefix
0000000000011288 d _Repository_git_object_lookup_prefix__doc__
                 U _git_blob_create_frombuffer
                 U _git_blob_create_fromdisk
                 U _git_blob_create_fromworkdir
                 U _git_blob_rawsize
                 U _git_checkout_head
                 U _git_checkout_index
                 U _git_checkout_tree
                 U _git_commit_author
                 U _git_commit_committer
                 U _git_commit_create
                 U _git_commit_free
                 U _git_commit_lookup
                 U _git_commit_lookup_prefix
                 ...

当我尝试使用pip时,它说:

代码语言:javascript
复制
(testenv)emil ~/sites/env/testenv/pygit2 > pip install pygit2
Requirement already satisfied (use --upgrade to upgrade): pygit2 in /Users/emil/sites/env/testenv/lib/python2.7/site-packages
Cleaning up...
(testenv)emil ~/sites/env/testenv/pygit2 > pip install pygit2 --upgrade
Requirement already up-to-date: pygit2 in /Users/emil/sites/env/testenv/lib/python2.7/site-packages
Cleaning up...

如果有人在我希望得到任何帮助之前就设置了这个问题,否则我会用它来记录这个问题并整理我的想法,并希望能记录一个解决方案。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-05-16 12:04:46

我成功地完成了这个设置,为了做到这一点,我必须阅读OSX的@rpath实现:

  • mac
  • http://www.mikeash.com/pyblog/friday-qa-2009-11-06-linking-and-install-names.html
  • tool.1.html

在阅读了这些之后,我继续进行了一个干净的安装,如下所示:

libgit2

代码语言:javascript
复制
emil ~/Sites/env/testenv > export LIBGIT2=`pwd`
emil ~/Sites/env/testenv > git clone git://github.com/libgit2/libgit2.git -b v0.18.0

注意:确保您签出了与当前pygit2版本兼容的标记,此时您可以使用-b v0.18.0

代码语言:javascript
复制
(testenv)emil ~/sites/env/testenv/libgit2 > mkdir build && cd build
(testenv)emil ~/sites/env/testenv/libgit2/build > cmake .. -DCMAKE_INSTALL_PREFIX=$LIBGIT2
(testenv)emil ~/sites/env/testenv/libgit2/build > cmake --build . --target install

注意:,如果您没有用cmake安装它,用Homebrew安装,用brew install cmake安装

现在,我们需要在libgit2库上设置安装名称,以便可以在rpath中找到它。

代码语言:javascript
复制
(testenv)emil ~/sites/env/testenv/lib > otool -D libgit2.0.18.0.dylib 
libgit2.0.18.0.dylib:
libgit2.0.dylib
(testenv)emil ~/sites/env/testenv/lib > install_name_tool -id "@rpath/libgit2.0.18.0.dylib" libgit2.0.18.0.dylib 
(testenv)emil ~/sites/env/testenv/lib > otool -D libgit2.0.18.0.dylib 
libgit2.0.18.0.dylib:
@rpath/libgit2.0.18.0.dylib

pygit2

代码语言:javascript
复制
(testenv)emil ~/sites/env/testenv > git clone git://github.com/libgit2/pygit2.git
(testenv)emil ~/sites/env/testenv > cd pygit2/
(testenv)emil ~/sites/env/testenv/pygit2 > python setup.py build

注意: OSX链接器没有pygit2教程中推荐的一些LDFLAGS,所以暂时跳过使用它们,稍后您将设置rpath

代码语言:javascript
复制
(testenv)emil ~/sites/env/testenv/pygit2 > python setup.py install

好的,现在您将得到这样一个错误,因为rpath没有在pygit2库上正确地设置:

代码语言:javascript
复制
(testenv)emil ~/sites/env/testenv/pygit2 > python -c 'import pygit2'
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "pygit2/__init__.py", line 32, in <module>
    import _pygit2
ImportError: dlopen(/Users/emil/sites/env/testenv/lib/python2.7/site-packages/_pygit2.so, 2): Library not loaded: @rpath/libgit2.0.18.0.dylib
  Referenced from: /Users/emil/sites/env/testenv/lib/python2.7/site-packages/_pygit2.so
  Reason: image not found

所以让我们把它设置为:

代码语言:javascript
复制
(testenv)emil ~/sites/env/testenv/pygit2 > cd /Users/emil/sites/env/testenv/lib/python2.7/site-packages/
(testenv)emil ~/sites/env/testenv/lib/python2.7/site-packages > install_name_tool -add_rpath "@loader_path/../../" _pygit2.so 

现在测试它,如果没有输出,那么一切都进行得很好:

代码语言:javascript
复制
(testenv)emil ~/sites/env/testenv/lib/python2.7/site-packages > python -c 'import pygit2'

:)

票数 1
EN

Stack Overflow用户

发布于 2013-05-16 08:15:56

pygit2 2网站上的说明似乎有点误导人。它们的默认分支(master)绑定目标libgit2 2的master分支(即最新版本,此时为0.18.0),但libgit2 2的默认分支是development。网站上的“最新”一词的含义还不清楚。

链接器无法找到的函数自上一次发布以来就已被删除,因此看起来您只是在针对错误的libgit2版本进行构建。使用libgit2 2的master分支或它的v0.18.0标记,您应该会没事的。

票数 3
EN

Stack Overflow用户

发布于 2016-04-12 14:40:36

在为salt堆栈安装libgit2和pygit2库时,我遇到了一个问题。最初的安装遵循pygit2文档上的说明,但在python2.7.10下,这会导致“在‘git_cert_hostkey’中没有名为‘父’的成员”这样的错误。

在谷歌搜索了很多之后,CarlosíNieto的话给了我一个提示,并最终在OSX10.11.4上安装了libgit2和pygit2。

用自制软件安装libgit2,注意安装的版本。

代码语言:javascript
复制
brew install libgit2

在我的例子中,安装了libgit2 0.23.4。

用源代码构建pygit2。检查changelog中与您安装的pygit2版本匹配的libgit2版本。这里我用标记v0.23.3克隆源代码。

代码语言:javascript
复制
git clone https://github.com/libgit2/pygit2.git -b v0.23.3
cd pygit2
python setup.py build
python setup.py install

最后,libgit2和pygit2都安装在您的mac上。希望这能帮上忙。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16570217

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档