柯南构建混合发布和调试

Posted

技术标签:

【中文标题】柯南构建混合发布和调试【英文标题】:Conan build mixes release and debug 【发布时间】:2022-01-03 00:56:54 【问题描述】:

我尝试在 windows 下构建一个简单的 cmake 应用程序。该应用程序依赖于 gtest,它是通过 conan 安装的。项目的基本设置如下:

conanfile.txt

[requires]
gtest/1.11.0

[generators]
cmake_find_package
cmake_paths
cmake

CMakeLists.txt

project(conan-myapp)
cmake_minimum_required(VERSION 3.1)
include($CMAKE_BINARY_DIR/conan_paths.cmake)
include($CMAKE_BINARY_DIR/conanbuildinfo.cmake)
conan_basic_setup(TARGETS)

find_package(GTest REQUIRED)

enable_testing()
include_directories($GTest_INCLUDE_DIR)

add_executable(myapp "main.cpp")
target_link_libraries(myapp GTest::gtest_main GTest::gtest )
add_test(myapp bin/myapp)

main.cpp

#include <gtest/gtest.h>

TEST(mytest, testit) 
    EXPECT_TRUE(false);

我使用以下命令来构建应用程序:

mkdir build
cd build 
conan install ..
cmake ..
cmake --build .

但我收到以下错误消息

gtest.lib(gtest-all.obj):错误 LNK2038:检测到不匹配 '_ITERATOR_DEBUG_LEVEL':值 '0' 与 main.obj 中的值 '2' 不匹配 [T:\project\build\cocpp19.vcxproj]

gtest.lib(gtest-all.obj):错误 LNK2038:检测到“RuntimeLibrary”不匹配:值 'MD_DynamicRelease' 与 main.obj 中的值 'MDd_DynamicDebug' 不匹配 [T:\project\build\cocpp19.vcxproj]

gtest_main.lib(gtest_main.obj):错误 LNK2038:检测到“_ITERATOR_DEBUG_LEVEL”不匹配:值“0”与 main.obj 中的值“2”不匹配 [T:\project\build\cocpp19.vcxproj]

gtest_main.lib(gtest_main.obj):错误 LNK2038:检测到“RuntimeLibrary”不匹配:> 值 'MD_DynamicRelease' 与 main.obj 中的值 'MDd_DynamicDebug' 不匹配 [T:\project\build\cocpp19.vcxproj]

LINK : 警告 LNK4098: defaultlib 'MSVCRT' 与使用其他库冲突;使用 /NODEFAULTLIB:library [T:\project\build\cocpp19.vcxproj]

【问题讨论】:

【参考方案1】:

正如错误消息所示,发布版本和调试版本之间存在混合。柯南安装了 gtest 的发行版。该项目是作为调试构建的。为避免这种混合,请指定构建类型,即调试以下命令有效

conan install .. -s build_type=Debug
cmake .. -DCMAKE_BUILD_TYPE=Debug
cmake --build .

你可以使用发布版

conan install .. -s build_type=Release
cmake .. -DCMAKE_BUILD_TYPE=Release
cmake --build .

【讨论】:

正确!默认情况下,Conan 构建 Release,但 Cmake 构建 Debug。

以上是关于柯南构建混合发布和调试的主要内容,如果未能解决你的问题,请参考以下文章

混合 STL 调试/发布库

如何在 Phonegap 和 Cordova 构建的混合应用程序上测试调试(Cpu 和 FPS)使用情况

混合模式调试(C++、C#、VB)

调试经验C++和C的混合编程以及库调用

8-4 Flutter Android混合开发实战-调试与发布

FlutterFlutter 混合开发 ( Dart 代码调试 | Flutter 单独调试 | 混合模式下 Flutter 调试 )