[cfe-dev] clang link errors

Zheng Wang jason.wangz at gmail.com
Thu Apr 7 07:11:51 PDT 2011


Hello,

I tried to build a clang module by following the tutorial given at:
http://www.cs.rpi.edu/~laprej/clang.html

I have managed to fixed all the compile time errors. However, I have
received many link time errors.

The source code, makefile and compile errors are given.

Can someone please shed some light on it?

Cheers,
Zheng

----------------------------------

Source:

#include "clang/Frontend/FrontendActions.h"
#include "clang/AST/ASTConsumer.h"
#include "clang/AST/RecursiveASTVisitor.h"

#include <llvm/Support/raw_ostream.h>
#include <clang/Basic/Diagnostic.h>
#include <clang/Basic/TargetInfo.h>
#include <clang/Basic/FileManager.h>
#include <clang/Lex/Preprocessor.h>
#include <clang/Lex/HeaderSearch.h>
#include <clang/Frontend/TextDiagnosticPrinter.h>
#include <clang/Basic/IdentifierTable.h>
#include <clang/Driver/Action.h>
#include <clang/Parse/Parser.h>
#include <clang/Sema/DeclSpec.h>
#include <clang/AST/ASTConsumer.h>
#include <clang/AST/Decl.h>
#include <clang/AST/DeclGroup.h>
#include <clang/Parse/ParseAST.h>
#include <clang/AST/ASTContext.h>
#include <clang/Frontend/DiagnosticOptions.h>
#include <clang/Basic/TargetOptions.h>

#include <cstdio>
#include <iostream>
#include <string>

using namespace clang;
using namespace std;

namespace {
  class BoostConASTConsumer : public ASTConsumer,
                              public
RecursiveASTVisitor<BoostConASTConsumer> {
  public:
    /// HandleTranslationUnit - This method is called when the ASTs for
entire
    /// translation unit have been parsed.
    virtual void HandleTranslationUnit(ASTContext &Ctx);

    bool VisitCXXRecordDecl(CXXRecordDecl *D) {
      std::cout << D->getNameAsString() << std::endl;
      return true;
  }
  };
}

ASTConsumer *BoostConAction::CreateASTConsumer(CompilerInstance &CI,
                                               llvm::StringRef InFile) {
  return new BoostConASTConsumer();
}

void BoostConASTConsumer::HandleTranslationUnit(ASTContext &Ctx) {
  fprintf(stderr, "Welcome to BoostCon!\n");
  TraverseDecl(Ctx.getTranslationUnitDecl());
}


int main(int argc, char** argv)
{
        if (argc < 2)
        {
                cerr << "No input file" << endl;
                exit(-1);
        }

        TextDiagnosticPrinter tdp(llvm::errs(), DiagnosticOptions());
        llvm::IntrusiveRefCntPtr<DiagnosticIDs> DiagID(new DiagnosticIDs());
        Diagnostic diag(DiagID, &tdp);
        LangOptions lang;
        FileSystemOptions FileSystemOpts;

        FileManager fm(FileSystemOpts);
        SourceManager sm(diag, fm);
        //SourceMgr sm;
        HeaderSearch headers(fm);
        TargetOptions TargetOpts;
        TargetInfo *ti = TargetInfo::CreateTargetInfo(diag, TargetOpts);
        Preprocessor pp(diag, lang, *ti, sm, headers);

        //PreprocessorInitOptions ppio;
        //InitializePreprocessor(pp, ppio);

        const FileEntry *file = fm.getFile(argv[1]);
        sm.createMainFileID(file);

        IdentifierTable tab(lang);
        SelectorTable sel;
        Builtin::Context builtins(*ti);
        BoostConASTConsumer c;
        ASTContext ctx(lang, sm, *ti, tab, sel, builtins, 0);
        ParseAST(pp, &c, ctx, false, true);

        return 0;
}

===========================================================================

MAKEFILE:

==============================================================================

SOURCE=BoostConAction.cpp
OBJ=$(SOURCE:.cpp=.o)
TARGET=bca

all:${TARGET}

${TARGET}:${OBJ}
        g++ `llvm-config --ldflags --libs` -lclangBasic -lclangLex
-lclangDriver -lclangFrontend -lclangParse \
        -lclangAST -lclangSema -lclangAnalysis -lclang -o ${TARGET} ${OBJ}

${OBJ}:${SOURCE}
        g++ -g -fno-rtti `llvm-config --cxxflags` -c ${SOURCE}

clean:
        rm -f ${OBJ} ${TARGET}

=======================================================================================

ERRORS

=========================================================================================

g++ -g -fno-rtti `llvm-config --cxxflags` -c BoostConAction.cpp
g++ `llvm-config --ldflags --libs` -lclangBasic -lclangLex -lclangDriver
-lclangFrontend -lclangParse \
        -lclangAST -lclangSema -lclangAnalysis -lclang -o bca
BoostConAction.o
BoostConAction.o: In function `clang::RecursiveASTVisitor<(anonymous
namespace)::BoostConASTConsumer>::TraverseParmVarDecl(clang::ParmVarDecl*)':
/workspace/build/include/clang/AST/RecursiveASTVisitor.h:1600: undefined
reference to `clang::ParmVarDecl::getDefaultArg()'
BoostConAction.o: In function `clang::RecursiveASTVisitor<(anonymous
namespace)::BoostConASTConsumer>::TraverseDeclContextHelper(clang::DeclContext*)':
/workspace/build/include/clang/AST/RecursiveASTVisitor.h:1049: undefined
reference to `clang::DeclContext::decls_begin() const'
/workspace/build/include/clang/AST/RecursiveASTVisitor.h:1050: undefined
reference to `clang::DeclContext::decls_end() const'
BoostConAction.o: In function `clang::RecursiveASTVisitor<(anonymous
namespace)::BoostConASTConsumer>::TraverseNestedNameSpecifierLoc(clang::NestedNameSpecifierLoc)':
/workspace/build/include/clang/AST/RecursiveASTVisitor.h:532: undefined
reference to `clang::NestedNameSpecifier::getKind() const'
/workspace/build/include/clang/AST/RecursiveASTVisitor.h:541: undefined
reference to `clang::NestedNameSpecifierLoc::getTypeLoc() const'
BoostConAction.o: In function `clang::RecursiveASTVisitor<(anonymous
namespace)::BoostConASTConsumer>::TraverseNestedNameSpecifier(clang::NestedNameSpecifier*)':
/workspace/build/include/clang/AST/RecursiveASTVisitor.h:508: undefined
reference to `clang::NestedNameSpecifier::getKind() const'
BoostConAction.o: In function `clang::RecursiveASTVisitor<(anonymous
namespace)::BoostConASTConsumer>::TraverseObjCMessageExpr(clang::ObjCMessageExpr*)':
/workspace/build/include/clang/AST/RecursiveASTVisitor.h:1871: undefined
reference to `clang::ObjCMessageExpr::children()'
BoostConAction.o: In function `clang::RecursiveASTVisitor<(anonymous
namespace)::BoostConASTConsumer>::TraverseUnaryExprOrTypeTraitExpr(clang::UnaryExprOrTypeTraitExpr*)':
/workspace/build/include/clang/AST/RecursiveASTVisitor.h:1790: undefined
reference to `clang::UnaryExprOrTypeTraitExpr::children()'
BoostConAction.o: In function `clang::RecursiveASTVisitor<(anonymous
namespace)::BoostConASTConsumer>::TraverseClassTemplateSpecializationDecl(clang::ClassTemplateSpecializationDecl*)':
/workspace/build/include/clang/AST/RecursiveASTVisitor.h:1407: undefined
reference to `clang::CXXRecordDecl::getTemplateSpecializationKind() const'
BoostConAction.o: In function `clang::RecursiveASTVisitor<(anonymous
namespace)::BoostConASTConsumer>::TraverseFunctionInstantiations(clang::FunctionTemplateDecl*)':
/workspace/build/include/clang/AST/RecursiveASTVisitor.h:1284: undefined
reference to `clang::FunctionDecl::getTemplateSpecializationKind() const'
BoostConAction.o: In function `clang::RecursiveASTVisitor<(anonymous
namespace)::BoostConASTConsumer>::TraverseClassTemplatePartialSpecializationDecl(clang::ClassTemplatePartialSpecializationDecl*)':
/workspace/build/include/clang/AST/RecursiveASTVisitor.h:1437: undefined
reference to
`clang::ClassTemplateSpecializationDecl::getSpecializedTemplate() const'
BoostConAction.o: In function `main':
....
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20110407/6763f5f4/attachment.html>


More information about the cfe-dev mailing list