柯南构建混合了发布和调试

Conan build mixes release and debug

本文关键字:调试 构建 混合 柯南      更新时间:2024-05-10

我尝试在windows下构建一个简单的cmake应用程序。该应用程序依赖于gtest,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]

链接:警告LNK4098:defaultlib"MSVCRT"与其他库的使用冲突;使用/NODEFAULTLIB:库[T:\project\build\cocpp19.vcxproj]

正如错误消息所示,发布版本和调试版本是混合的。conan安装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 .

我遇到了同样的问题,结果发现罪魁祸首是我的conanfile.py:中缺少设置声明

class MyProject(ConanFile):
settings = "os", "arch", "compiler", "build_type"

添加后,构建类型将正确传递给CMake,而无需手动指定。它也适用于conan build

我不确定用conanfile.txt是否可能实现,但切换到conanfile.py很容易:

from conans import ConanFile
from conan.tools.cmake import CMake
class MyProject(ConanFile):
name = "my_project"
version = "0.1"
settings = "os", "compiler", "build_type", "arch"
requires = "gtest/1.11.0"
generators = "cmake_find_package", "cmake_paths", "cmake"