链接在Clion中不工作的libgit2

问题描述:

我发现很难在Clion中使用libgit2 API运行任何东西。我使用Homebrew安装了所有需要的东西。与此前编辑链接在Clion中不工作的libgit2

args = std_cmake_args 
    ... 
    args << "-DBUILD_SHARED_LIBS=OFF" 

#include <git2.h>工作良好,但我似乎无法运行它。

我尝试一些简单的例子,它似乎并没有被工作,所以我决定采取libgit2拥有例如从​​,看它是否会工作,但没有好消息 我得到了以下错误

/Applications/CLion.app/Contents/bin/cmake/bin/cmake --build /Users/addo/ClionProjects/Libgit2Training/cmake-build-debug --target Libgit2Training -- -j 4 [ 50%] Building C object CMakeFiles/Libgit2Training.dir/main.c.o [100%] Linking C executable Libgit2Training Undefined symbols for architecture i386: "_git_blob_lookup", referenced from: 
     _blob_parsing in main.c.o "_git_blob_rawcontent", referenced from: 
     _blob_parsing in main.c.o "_git_blob_rawsize", referenced from: 
     _blob_parsing in main.c.o "_git_commit_author", referenced from: 
     _commit_parsing in main.c.o 
     _revwalking in main.c.o "_git_commit_committer", referenced from: 
     _commit_parsing in main.c.o "_git_commit_create_v", referenced from: 
     _commit_writing in main.c.o "_git_commit_free", referenced from: 
     _commit_parsing in main.c.o 
     _tag_parsing in main.c.o 
     _revwalking in main.c.o "_git_commit_id", referenced from: 
     _commit_parsing in main.c.o "_git_commit_lookup", referenced from: 
     _commit_writing in main.c.o 
     _commit_parsing in main.c.o 
     _revwalking in main.c.o "_git_commit_message", referenced from: 
     _commit_parsing in main.c.o 
     _revwalking in main.c.o "_git_commit_parent", referenced from: 
     _commit_parsing in main.c.o "_git_commit_parentcount", referenced from: 
     _commit_parsing in main.c.o "_git_commit_time", referenced from: 
     _commit_parsing in main.c.o "_git_config_get_int32", referenced from: 
     _config_files in main.c.o "_git_config_get_string", referenced from: 
     _config_files in main.c.o "_git_config_open_ondisk", referenced from: 
     _config_files in main.c.o "_git_index_entrycount", referenced from: 
     _index_walking in main.c.o "_git_index_free", referenced from: 
     _index_walking in main.c.o "_git_index_get_byindex", referenced from: 
     _index_walking in main.c.o "_git_libgit2_init", referenced from: 
     _main in main.c.o "_git_libgit2_shutdown", referenced from: 
     _main in main.c.o "_git_object_free", referenced from: 
     _tree_parsing in main.c.o "_git_object_type2string", referenced from: 
     _object_database in main.c.o 
     _tag_parsing in main.c.o "_git_odb_object_data", referenced from: 
     _object_database in main.c.o "_git_odb_object_free", referenced from: 
     _object_database in main.c.o "_git_odb_object_size", referenced from: 
     _object_database in main.c.o "_git_odb_object_type", referenced from: 
     _object_database in main.c.o "_git_odb_read", referenced from: 
     _object_database in main.c.o "_git_odb_write", referenced from: 
     _object_database in main.c.o "_git_oid_fmt", referenced from: 
     _oid_parsing in main.c.o 
     _object_database in main.c.o 
     _commit_writing in main.c.o 
     _commit_parsing in main.c.o 
     _reference_listing in main.c.o "_git_oid_fromstr", referenced from: 
     _oid_parsing in main.c.o 
     _commit_writing in main.c.o 
     _commit_parsing in main.c.o 
     _tag_parsing in main.c.o 
     _tree_parsing in main.c.o 
     _blob_parsing in main.c.o 
     _revwalking in main.c.o 
     ... "_git_reference_list", referenced from: 
     _reference_listing in main.c.o "_git_reference_lookup", referenced from: 
     _reference_listing in main.c.o "_git_reference_symbolic_target", referenced from: 
     _reference_listing in main.c.o "_git_reference_target", referenced from: 
     _reference_listing in main.c.o "_git_reference_type", referenced from: 
     _reference_listing in main.c.o "_git_repository_free", referenced from: 
     _main in main.c.o "_git_repository_index", referenced from: 
     _index_walking in main.c.o "_git_repository_odb", referenced from: 
     _object_database in main.c.o "_git_repository_open", referenced from: 
     _main in main.c.o "_git_revwalk_free", referenced from: 
     _revwalking in main.c.o "_git_revwalk_new", referenced from: 
     _revwalking in main.c.o "_git_revwalk_next", referenced from: 
     _revwalking in main.c.o "_git_revwalk_push", referenced from: 
     _revwalking in main.c.o "_git_revwalk_sorting", referenced from: 
     _revwalking in main.c.o "_git_signature_new", referenced from: 
     _commit_writing in main.c.o "_git_strarray_free", referenced from: 
     _reference_listing in main.c.o "_git_tag_lookup", referenced from: 
     _tag_parsing in main.c.o "_git_tag_message", referenced from: 
     _tag_parsing in main.c.o "_git_tag_name", referenced from: 
     _tag_parsing in main.c.o "_git_tag_target", referenced from: 
     _tag_parsing in main.c.o "_git_tag_target_type", referenced from: 
     _tag_parsing in main.c.o "_git_tree_entry_byindex", referenced from: 
     _tree_parsing in main.c.o "_git_tree_entry_byname", referenced from: 
     _tree_parsing in main.c.o "_git_tree_entry_name", referenced from: 
     _tree_parsing in main.c.o "_git_tree_entry_to_object", referenced from: 
     _tree_parsing in main.c.o "_git_tree_entrycount", referenced from: 
     _tree_parsing in main.c.o "_git_tree_lookup", referenced from: 
     _commit_writing in main.c.o 
     _tree_parsing in main.c.o "_giterr_last", referenced from: 
     _check_error in main.c.o ld: symbol(s) not found for architecture i386 clang: error: linker command failed with exit code 1 (use -v to see invocation) make[3]: *** [Libgit2Training] Error 1 make[2]: *** [CMakeFiles/Libgit2Training.dir/all] Error 2 make[1]: *** [CMakeFiles/Libgit2Training.dir/rule] Error 2 make: *** [Libgit2Training] Error 2 

这是我在克利翁

cmake_minimum_required(VERSION 3.6) 
project(Libgit2Training) 

#set(CMAKE_CXX_STANDARD 11) 
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -std=c11 ") 



set(SOURCE_FILES main.c) 
add_executable(Libgit2Training ${SOURCE_FILES}) 

CmakeList.txt我试着libgit2页一些帮助和改变了我的CmakeList.txt集()这个

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -std=c11 
     CFLAGS += -I/usr/local/Cellar/libgit2/include 
     LDFLAGS += -L/usr/local/Cellar/libgit2/binaries 
     LIBRARIES += -lgit2 ") 

和我得到了以下错误:尽量减少我看到

/Applications/CLion.app/Contents/bin/cmake/bin/cmake --build /Users/addo/ClionProjects/Libgit2Training/cmake-build-debug --target Libgit2Training -- -j 4 
[ 50%] Building C object CMakeFiles/Libgit2Training.dir/main.c.o 
[100%] Linking C executable Libgit2Training 
clang: error: no input files 
make[3]: *** [Libgit2Training] Error 1 
make[2]: *** [CMakeFiles/Libgit2Training.dir/all] Error 2 
make[1]: *** [CMakeFiles/Libgit2Training.dir/rule] Error 2 
make: *** [Libgit2Training] Error 2 

seemed not to parse in a .c file. 

我是新来libgit2

我只是试图让熟悉并从中学到了,但似乎并不像工作我知道任何普通的API。所有的帮助将不胜感激。

新年快乐!

+0

你为什么禁用共享库?你是怎么想出这个字符串来设置“CMAKE_C_FLAGS”的?这在libgit2的链接指南中没有提及,它们不是用于自制程序的正确路径,它非常不告诉C编译器如何链接它。看起来你的问题是非常通用的,关于CMake,C编译器和环境变量如何工作,而不是libgit2特定的任何东西。 –

+0

@CarlosMartínNieto我禁用了共享库,因为我想让它们在mac上成为静态而不是dyllib。我从libgit2主页[这里] [https://libgit2.github.com/docs/guides/build-and-link]获得了字符串,我只是启用了共享库并重新安装并构建了一切从零开始,但我仍然获取架构i386的未定义符号: “_git_blob_lookup”,引用自: _blob_parsing in main.co –

+0

@CarlosMartínNieto您在这一点上建议我做什么?我应该从Clion构建首选项链接它,还是我可以在CMakeList.txt文件中完成它。 –

我现在解决了这个问题。感谢@CarlosMartínNieto,我看着错误的地方。我改变了CMakefileList这样:

cmake_minimum_required(VERSION 3.6) 
project(Libgit2Training) 

#set(CMAKE_CXX_STANDARD 11) 
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -std=c11 -L/opt/local/lib -lgit2 -lssh2") 
/opt/local/lib # for macports 
set(SOURCE_FILES main.c) 
add_executable(Libgit2Training ${SOURCE_FILES}) 

我仍然得到专为x86_64体系被链接(I386)的错误,所以我在Clion偏好改变了构建选项本

-D "CMAKE_OSX_ARCHITECTURES:STRING=x86_64" 

现在一切正常。我想现在我会更加乐于使用libgit2 API。谢谢。