C++ CMake未正确链接.obj文件LNK2019\uu此调用

C++ CMake未正确链接.obj文件LNK2019\uu此调用,c++,visual-c++,cmake,lnk2019,lnk2001,C++,Visual C++,Cmake,Lnk2019,Lnk2001,首先,我已经在这方面工作了好几天了,我已经尝试了所有可能的修复方法。我去了第十个谷歌搜索页面搜索修复方法,但我无法让它工作 我正在将Unix应用程序G++/Bison/Flex移植到Windows MSVC/WinBison/WinFlex。我使用CMake作为一个构建系统,其想法是从VS CMD构建项目,并为VS project的修改做好准备。该项目是为了在两个平台上工作,所以所有的修改都应该在CMakeLists.txt中完成,这样我就不必编写在VS中完成的特殊指令 preprocessor

首先,我已经在这方面工作了好几天了,我已经尝试了所有可能的修复方法。我去了第十个谷歌搜索页面搜索修复方法,但我无法让它工作

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

preprocessor.cc中有问题的行是

状态currenttask->CPFs

方法Statestd::vector const&cpfs在states.h中声明,代码如下:

结构状态{ Statestd::向量常量和cpfs; StateState常量&other:stateother.state{} Stateint stateSize:statestateSize,0.0{}

并在各州实施。cc:

State::Statevector常量和cpfs{ 对于无符号整数i=0;igetInitialValue; } }

states.h包含在states.cc中,rddl.h包含在preprocessor.cc中,类状态在preprocessor.h中向前声明,preprocessor.cc中包含类状态

我得到的错误是

[36%]链接CXX可执行文件rddl-parser.exe preprocessor.cc.obj:错误LNK2019:未解析的外部符号公共:_thiscall State::Stateclass std::vector const&?0State@@QAE@ABV?$vector@PAUConditionalProbabilityFunction@@V$allocator@PAUConditionalProbabilityFunction@@@std@@@std@@@Z在函数private:void\u thiscall预处理器::prepareActionsvoid中引用?prepareActions@Preproc埃索@@AAEXXZ rddl.cc.obj:错误LNK2001:未解析的外部符号公共:虚拟无效\uu此调用逻辑表达式::evaluatedouble&,结构状态常量&,类ActionState常量&?evaluate@LogicalExpression@@ubexanabustate@@@ABVActionState@@@Z

在Unix上构建链接时,链接工作得非常好。但当我在Windows上运行链接时,会出现此错误

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

setCMAKE_EXE_LINKER_FLAGS${CMAKE_EXE_LINKER_FLAGS}/DEBUG setCMAKE_CXX_标志_发布-DNDEBUG 添加\u executablerddl-parser${RDDL\u parser\u SOURCES}${FLEX\u scanner\u OUTPUTS}${BISON\u parser\u OUTPUTS} target_link_librariesrddl-parser${FLEX_LIBRARIES}${BISON_LIBRARIES}


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

检查函数/类的声明是否与它们的定义完全匹配。
编译logical_expressions.cc时,可能会定义与preprocessor.cc和rddl.cc文件的转发声明不同的内容。

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

请发布一个@m.s。我试图包含更多的上下文。这个项目非常大,这是我能做的最好的,同时保持它的简洁。Statestd::vector const&cpfs在哪里实现?你真的应该试着去掉y我们的项目通过删除尽可能多的内容来解决这个问题。就像我在states.h中编写、定义或更确切地说实现并在preprocessor.cc中使用的一样。我相信这个问题存在于CMake代码中。我缺少一些东西,但无法实现什么。链接器错误是关于Statestd::vector const&,而不是Stateint。此构造函数未在中定义您粘贴的代码。该代码在Unix上工作,对类名没有任何修改,因此这不是问题。如果您已经检查并排除了声明/定义匹配问题,那就可以了。那么在链接时可能不包括states.cc翻译单元。请将详细性设置增加到true CM创建详细的MAKEFILE,然后使用cmake重新配置和重建?将构建日志发布到上,谢谢。完成此操作后,这里是构建日志。请将cmake详细的MAKEFILE设置为True,例如在cmake Gui的变量列表中选中该名称,然后重新配置并再次生成项目文件。然后通过命令行运行:cmake-build.current working directory是您在cmake gui中生成项目文件的根目录,也称为build directory set。然后,您应该会得到一个详细的输出,其中包含所有调用,并将参数传递到msvc,即cl.exe和link.exe。查看日志,可以跟踪在墨迹。我已将setCMAKE_VERBOSE_MAKEFILE设置为True,但我没有比粘贴在gist上更详细的输出。在CMakeCache或CMakeOutputLog中找不到任何其他内容。但是,如果它与链接的其他文件成功编译,怎么会出现问题?我甚至更改了组件的顺序 对文件进行重新整理,以防产生影响,但事实并非如此。