Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Errors when linking against clang

I feel like I'm missing something very simple here. I want to play around with clang, so as a starting point I followed the code example in this video, around 3:40. The code is as follows:

#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;
}

In the video, he does not states that he's omitted the two #include directives. I think I correctly filled those in in my example above. He also omits how the file was compiled and linked, which is the part I'm having trouble with. Following the instructions here I checked out and compiled clang and llvm. The files were checked out to ~/src/llvm then compiled from ~/src/build (just as the instructions say), and now I'm trying to make the simple test project above in ~/src/test. Below is how I'm calling gcc, and the output.

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

I checked ~/build/Debut+Asserts/lib and there is both libclang.a and libclang.so in that directory. I'm not sure what I'm doing wrong. I've tried googling around and haven't found any tips, or instructions on what I should be linking against. Regardless, I've tried a few different things and nothing seems to work.

like image 414
Alex Avatar asked Jan 30 '26 15:01

Alex


1 Answers

Put -lclang after main.cpp. The order of arguments matters to gcc, as it resolves symbols from static libraries in order. See also Why does the order in which libraries are linked sometimes cause errors in GCC?.

like image 94
nneonneo Avatar answered Feb 01 '26 08:02

nneonneo



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!