3

我下载并编译了CppUnit以使用 Visual Studio 2010 进行编译。

转换后,我可以加载 CppUnitLibraries,它给了我 cppunit.lib 和 cppunit_dll.lib/dll。将标头和库复制到目录后,我运行此命令得到很多错误。

我发现库的冲突如下

LINK : warning LNK4098: defaultlib 'MSVCRTD' conflicts with use of other libs; use /NODEFAULTLIB:library

但是,以下命令似乎不起作用。

cl main.cpp complex.cpp testset.cpp /I"C:\CppUnit\include" /link /libpath:"C:\CppUnit\lib" cppunit.lib /NODEFAULTLIB:library

他们怎么了?

这是我用于编译/链接的命令。

cl main.cpp complex.cpp testset.cpp /I"C:\CppUnit\include" /link /libpath:"C:\CppUnit\lib" cppunit.lib

这是来自 VS2010 的错误消息。

cppunit.lib(TestResult.obj):错误 LNK2038:检测到“_ITERATOR_DEBUG_LEVEL”不匹配:

...

node@@@Z) 已在 LIBCMT.lib(typinfo.obj) 中定义
链接:警告 LNK4098:defaultlib 'MSVCRTD' 与使用其他库冲突;使用 /NODEFAULTLIB:lib
稀有
main.exe:致命错误 LNK1169:找到一个或多个多重定义符号

添加

CppUnit 提供了旧版本的项目文件(dsw),所以我需要手动将文件转换为 2010 解决方案项目。

对于该错误,缺少 /MD 进行编译是问题的根源。对于其他编译警告,我需要添加 /EHsc 参数。

cl /EHsc /MD /c /I"./CppUnit/include" main.cpp testset.cpp complex.cpp
link /libpath:"CppUnit/lib" main.obj testset.obj complex.obj cppunit.lib /out:cpptest_static.exe
link /libpath:"CppUnit/lib" main.obj testset.obj complex.obj cppunit_dll.lib /out:cpptest_dynamic.exe
4

3 回答 3

2

似乎您在调试模式下编译了 CppUnit,但现在您正在以发布模式编译当前文件。这些不应该混合在一起,这就是编译器告诉你的。

解决此问题的最快方法可能是使用 VS 项目,并根据用于编译 CppUnit 的项目检查其设置。

在您的编辑中:您还在混合运行时库(例如,检查两者是否使用 /MD 开关(即多线程 DLL)进行编译)

于 2011-01-11T14:47:47.150 回答
1

我将我的 CPPUNIT 项目升级到了 Visual Studio 2010,并且不得不手动修复它。构建中的问题在于复制输出文件的最终操作。

对于 cppunit_dll 项目,自定义命令之一是:

copy "$(TargetPath)" ..\..\lib\$(TargetName).dll
copy "$(TargetDir)$(TargetName).lib" ..\..\lib\$(TargetName).lib

$(TargetName) 是“cppunit_dll”。

这与我们实际构建的内容相冲突:如果您查看链接器选项,您会看到输出文件名为“cppunitd_dll.dll”。

我使用的解决方案是转到 ConfigurationPropertys\General,并将“目标名称”从 $(ProjectName) 更改为“cppunitd_dll”。

我不得不为 cppunit 项目提供类似的解决方案。

于 2011-07-06T06:38:38.150 回答
0

从 SVN 签出源代码后,阅读 cppunit 文件夹中的 INSTALL-VS.Net2008.txt。

基本上:examples文件夹下有一个visual studio解决方案。

话虽这么说...在转换它之后,我仍然无法在 vs2010 上构建它而不会出现错误。我得到“cmd.exe”失败并且无法复制 dll。

于 2011-06-05T02:12:04.630 回答