Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用CMake在LLVM过程中使用多个源文件_C++_Cmake_Llvm - Fatal编程技术网

C++ 使用CMake在LLVM过程中使用多个源文件

C++ 使用CMake在LLVM过程中使用多个源文件,c++,cmake,llvm,C++,Cmake,Llvm,我试图用两个源文件创建一个LLVM过程,但当我编译时,cmake对我大叫: [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-initial

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

[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
关键是:

针对未定义的符号重新定位R_X86_64_PC32 `_ZTVN12_GLOBAL_uun_18;u hydrogene’在制作共享文件时不能使用 对象用-fPIC重新编译

我尝试将-fPIC添加到我的编译标志中(为了更好的度量,还添加了链接标志),但没有任何帮助。这是我的CMakeLists.txt:

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
)
但是我得到了相同的输出。我做错了什么?我觉得使用多个源文件应该非常简单:/

谢谢

源代码:

氢。h:

#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");
#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;
};
条件_blocks.cpp:(第二个文件)


将代码更改为以下格式修复了该问题。我相信这是在标题中添加了“virtual”关键字,同时还包含了“virtual~Hydrogen(){}”

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

相同的CMakeLists.txt发布的问题

氢。h:

#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");
#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:

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

这不是CMake抱怨,而是链接器。你的代码看起来像什么?该符号似乎是缺少的vtable:
vtable for(匿名名称空间)::Hydrogen
目前,除了包含头文件之外,第二个文件(conditional_blocks.cpp)中没有实际的代码。第一个文件中只有一个基本函数传递。没什么特别的。我写的是“展示”,而不是“简要描述”,所以我们不需要猜测。不管它值多少钱,你可能属于
氢类。在没有看到代码的情况下很难说。我更新了帖子以包含所有相关文件(减少了一点)。另外,如果这有什么不同的话,我也在用忍者建造。@tdwyer:在堆栈溢出上,我们在问题的标题或正文中不使用已解决的标记。相反,创建一个回答帖子,并在那里描述解决方案。然后你可以回答问题,这就意味着你解决了问题。请注意,在任何情况下,问题都应该包含原始代码(有问题)。
#include "hydrogen.h"