CMake没有正确链接.obj文件LNK2019 __thiscall

时间:2017-01-02 14:16:21

标签: c++ visual-c++ cmake lnk2019 lnk2001

首先,我已经为此工作了好几天了,我已经尝试了所有可能的修复程序(去了第10个Google搜索页面搜索修复程序)但是我无法让它工作。

我将Unix应用程序(G ++ / Bison / Flex)移植到Windows(MSVC / WinBison / WinFlex)。我使用CMake作为构建系统,其想法是从VS CMD构建项目并准备好VS项目进行修改。该项目旨在在两个平台上运行,因此所有修改都应在CMakeLists.txt中完成,这样我就不必在VS中编写特殊指令。

preprocessor.cc中有问题的行

State current(task->CPFs);

虽然方法State(std::vector<ConditionalProbabilityFunction*> const& cpfs)states.h中使用以下代码声明:

struct State { State(std::vector<ConditionalProbabilityFunction*> const& cpfs); State(State const& other) : state(other.state) {} State(int stateSize) : state(stateSize, 0.0) {}

并在states.cc中实施:

State::State(vector<ConditionalProbabilityFunction*> const& cpfs) { for (unsigned int i = 0; i < cpfs.size(); ++i) { state.push_back(cpfs[i]->getInitialValue()); } }

states.h包含在states.ccrddl.h中(包含在preprocessor.cc中),class Statespreprocessor.h中正向声明(其中包含在preprocessor.cc)中。

我得到的错误是

[ 36%] Linking CXX executable rddl-parser.exe preprocessor.cc.obj : error LNK2019: unresolved external symbol "public: __thiscall State::State(class std::vector<struct ConditionalProbabilityFunction *,class std::allocator<struct ConditionalProbabilityFunction *> > const &)" (??0State@@QAE@ABV?$vector@PAUConditionalProbabilityFunction@@V?$allocator@PAUConditionalProbabilityFunction@@@std@@@std@@@Z) referenced in function "private: void __thiscall Preprocessor::prepareActions(void)" (?prepareActions@Preprocessor@@AAEXXZ) rddl.cc.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall LogicalExpression::evaluate(double &,struct State const &,class ActionState const &)const " (?evaluate@LogicalExpression@@UBEXAANABUState@@ABVActionState@@@Z)

在Unix上构建时,链接可以很好地工作。但是当我在Windows上运行它时,我收到此错误。

这是执行链接的CMake代码的一部分:

set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /DEBUG") set(CMAKE_CXX_FLAGS_RELEASE "-DNDEBUG") add_executable(rddl-parser ${RDDL_PARSER_SOURCES} ${FLEX_scanner_OUTPUTS} ${BISON_parser_OUTPUTS}) target_link_libraries(rddl-parser ${FLEX_LIBRARIES} ${BISON_LIBRARIES})

将函数定义复制到源文件的选项是不行的。

2 个答案:

答案 0 :(得分:0)

好的,这个项目中有一些几乎重复的代码,我注意到State被定义为struct而不是类。当我将其切换为使用所有公共方法定义为类时,编译通过。有趣的是,这在Unix上并不是一个问题,而且在Windows上。

答案 1 :(得分:-1)

检查函数/类的声明是否与其定义完全匹配。 当编译logical_expressions.cc时,您可能会定义一些与preprocessor.cc和rddl.cc文件的前向声明不同的内容。