首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用CMake在LLVM传递中使用多个源文件

使用CMake在LLVM传递中使用多个源文件
EN

Stack Overflow用户
提问于 2016-04-11 00:31:24
回答 1查看 870关注 0票数 2

我试图用两个源文件创建一个LLVM传递,但是当我编译时,cmake对我大喊大叫:

代码语言:javascript
复制
[1/1] Linking CXX shared module lib/LLVMHydrogen.so
FAILED: : && /usr/bin/c++  -fPIC -fPIC -fvisibility-inlines-hidden -Wall -W -Wno-unused-parameter -Wwrite-strings -Wcast-qual -Wno-missing-field-initializers -pedantic -Wno-long-long -Wno-maybe-uninitialized -Wdelete-non-virtual-dtor -Wno-comment -std=c++11 -fPIC -g   -shared -Wl,-soname,LLVMHydrogen.so -o lib/LLVMHydrogen.so lib/Transforms/Hydrogen/CMakeFiles/LLVMHydrogen.dir/Hydrogen.cpp.o lib/Transforms/Hydrogen/CMakeFiles/LLVMHydrogen.dir/conditional_blocks.cpp.o  -Wl,-rpath,"\$ORIGIN/../lib" && :
/usr/bin/ld: lib/Transforms/Hydrogen/CMakeFiles/LLVMHydrogen.dir/conditional_blocks.cpp.o: relocation R_X86_64_PC32 against undefined symbol `_ZTVN12_GLOBAL__N_18HydrogenE' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: final link failed: Bad value

关键是:

在创建共享对象时不能使用针对未定义符号`_ZTVN12_GLOBAL__N_18HydrogenE‘的重新定位`_ZTVN12_GLOBAL__N_18HydrogenE;使用-fPIC重新编译

我试着将-fPIC添加到我的编译标志中(并以良好的方式链接标志),但没有任何帮助。这是我的CMakeLists.txt:

代码语言:javascript
复制
SET(COMPILE_FLAGS "-fPIC")
SET(LINK_FLAGS    "-lPIC")

SET( CMAKE_CXX_FLAGS  "${CMAKE_CXX_FLAGS} ${COMPILE_FLAGS}" )
SET( CMAKE_EXE_LINKER_FLAGS  "${CMAKE_EXE_LINKER_FLAGS} ${LINK_FLAGS}" )

add_llvm_loadable_module( LLVMHydrogen
  Hydrogen.cpp
  conditional_blocks.cpp

  DEPENDS
  intrinsics_gen
)

但我得到了同样的输出。我做错了什么?我觉得使用多个源文件应该非常简单:/

谢谢

源代码:

氢氢:

代码语言:javascript
复制
#include "llvm/IR/Function.h"
#include "llvm/IR/Module.h"
#include "llvm/IR/DebugInfo.h"
#include "llvm/Pass.h"
#include "llvm/Support/raw_ostream.h"

using namespace std;
using namespace llvm;

namespace {
    struct Hydrogen : public FunctionPass {

    static char ID; // Pass identification, replacement for typeid
    Hydrogen() : FunctionPass(ID) {}

    bool runOnFunction(Function &f) override;
    void getAnalysisUsage(AnalysisUsage &AU) const override {
        AU.setPreservesAll();       
    }
    };
}

static const char h_name[] = "Hydrogen pass";
char Hydrogen::ID = 0;
static RegisterPass<Hydrogen> X("Hydrogen", "Hydrogen Pass");

hydrogen.cpp:(第一个“主”文件)

代码语言:javascript
复制
#include "hydrogen.h"

bool Hydrogen::runOnFunction(Function &fun)
{
        return true;
}

conditional_blocks.cpp:(第二个文件)

代码语言:javascript
复制
#include "hydrogen.h"
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-12 20:08:00

将代码更改为以下代码解决了问题。我认为这是在标题中添加了“虚拟”关键字,并包含了“虚拟氢(){ }”。

具有多个LLVM源文件的工作源:

同样的CMakeLists.txt发布在质疑中。

氢氢:

代码语言:javascript
复制
#include ....

using namespace std;
using namespace llvm;

struct Hydrogen : public FunctionPass {

    static char ID; // Pass identification, replacement for typeid
    Hydrogen() : FunctionPass(ID) {}

    virtual ~Hydrogen() { }

    virtual void getAnalysisUsage(AnalysisUsage &AU) const override {
        AU.setPreservesAll();       
    }

    virtual bool runOnFunction(Function &f) override;
};

hydrogen.cpp:

代码语言:javascript
复制
#include "hydrogen.h"

using namespace hydrogen_ns;

static const char h_name[] = "Hydrogen pass";
char Hydrogen::ID = 0;
static RegisterPass<Hydrogen> X("Hydrogen", "Hydrogen Pass");

bool Hydrogen::runOnFunction(Function &fun)
{
        return true;
}

conditional_blocks.cpp:

代码语言:javascript
复制
#include "hydrogen.h"
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36538063

复制
相关文章

相似问题

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