CMake 未正确链接 .obj 文件 LNK2019 __thiscall

CMake not linking .obj files properly LNK2019 __thiscall

首先,我已经为此工作好几天了,我已经尝试了所有可能的修复(转到第 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})

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

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

好的,在这个项目中有一些几乎重复的代码,我注意到 State 被定义为结构而不是 class。当我将它切换为使用所有 public 方法定义为 class 时,编译通过了。有趣的是,这在 Unix 上不是问题,而是在 Windows 上。