我觉得我在这里错过了一些非常简单的事情。我想玩clang,所以作为一个起点我遵循this video, around 3:40中的代码示例。代码如下:
#include "clang-c/Index.h" // Note: These two lines were
#include <stdio.h> // omitted from the video slides
int main(int argc, char *argv[])
{
CXIndex Index = clang_createIndex(0, 0);
CXTranslationUnit TU = clang_parseTranslationUnit(Index, 0, argv, argc, 0, 0, CXTranslationUnit_None);
for (unsigned I = 0, N = clang_getNumDiagnostics(TU); I != N; ++I)
{
CXDiagnostic Diag = clang_getDiagnostic(TU, I);
CXString String = clang_formatDiagnostic(Diag, clang_defaultDiagnosticDisplayOptions());
fprintf(stderr, "%s\n", clang_getCString(String));
clang_disposeString(String);
}
clang_disposeTranslationUnit(TU);
clang_disposeIndex(Index);
return 0;
}
在视频中,他没有声明他省略了两个#include
指令。我想我在上面的例子中正确填写了这些内容。他还省略了文件是如何编译和链接的,这是我遇到麻烦的部分。按照说明here我检查并编译了clang和llvm。这些文件已签出到~/src/llvm
,然后从~/src/build
编译(正如说明所述),现在我正在尝试在~/src/test
中创建上面的简单测试项目。下面是我如何调用gcc和输出。
gcc -I../llvm/tools/clang/include/ -L../build/Debug+Asserts/lib/ -lclang main.cpp -o test
/tmp/ccrpABsq.o: In function `main':
main.cpp:(.text+0x24): undefined reference to `clang_createIndex'
main.cpp:(.text+0x5f): undefined reference to `clang_parseTranslationUnit'
main.cpp:(.text+0x74): undefined reference to `clang_getNumDiagnostics'
main.cpp:(.text+0x8b): undefined reference to `clang_getDiagnostic'
main.cpp:(.text+0x93): undefined reference to `clang_defaultDiagnosticDisplayOptions'
main.cpp:(.text+0xab): undefined reference to `clang_formatDiagnostic'
main.cpp:(.text+0xc0): undefined reference to `clang_getCString'
main.cpp:(.text+0xed): undefined reference to `clang_disposeString'
main.cpp:(.text+0x10d): undefined reference to `clang_disposeTranslationUnit'
main.cpp:(.text+0x118): undefined reference to `clang_disposeIndex'
collect2: ld returned 1 exit status
make: *** [all] Error 1
我检查了~/build/Debut+Asserts/lib
,该目录中同时包含libclang.a
和libclang.so
。我不确定我做错了什么。我试过谷歌搜索,没有找到任何提示,或指示我应链接的内容。无论如何,我尝试过一些不同的东西,似乎没什么用。
答案 0 :(得分:2)
将-lclang
放在main.cpp
之后。参数的顺序对gcc
很重要,因为它按顺序从静态库中解析符号。另请参阅Why does the order in which libraries are linked sometimes cause errors in GCC?。