【问题标题】:Dependency management using Conan with a CMake project under VS2017VS2017下CMake项目使用柯南的依赖管理
【发布时间】:2018-03-08 04:09:35
【问题描述】:

我正在尝试使用 CMake 与 VS2017 的集成为 C++ 设置一个开发环境,以便在 Linux x64 下编译。为了更好地管理依赖关系,我选择使用柯南,但我对这个软件很陌生,我想知道让 VS2017 识别项目依赖关系的最佳方法是什么。

例如,我使用 Conan 为 C++ 安装 POCO 库,但是当我打开 Main.cpp 文件时,它无法识别头文件的位置,我不确定在哪里添加这些路径。

谁能给出一些提示来解决这个问题?

如果需要,所有源文件都在我的 Github 存储库 CppLinuxVS 中。

更新

根据这篇文章中的 cmets,您可以在下面找到文件的内容:

CMakeLists.txt

project(CppLinuxVS)
cmake_minimum_required(VERSION 2.8.12)
add_definitions("-std=c++11")

# Download automatically, you can also just copy the conan.cmake file
if(NOT EXISTS "${CMAKE_BINARY_DIR}/conan.cmake")
   message(STATUS "Downloading conan.cmake from https://github.com/conan-io/cmake-conan")
   file(DOWNLOAD "https://raw.githubusercontent.com/conan-io/cmake-conan/v0.8/conan.cmake"
                 "${CMAKE_BINARY_DIR}/conan.cmake")
endif()

include(${CMAKE_BINARY_DIR}/conan.cmake)
conan_cmake_run(CONANFILE conanfile.txt
                BASIC_SETUP CMAKE_TARGETS
                BUILD missing)

add_executable(CppLinuxVS Main.cpp)
target_link_libraries(CppLinuxVS ${CONAN_LIST})

conanfile.txt

[requires]
Poco/1.8.0@pocoproject/stable

[generators]
cmake

更新 2

将 conan.cmake 文件下载到项目中后,VS2017 中的 CMake 输出,而不是在 CMakeLists.txt 中指定下载。还根据 cmets 中的建议更新了 CMakeLists.txt 以要求 CMake 3.1.2。

1> 17:52:57: Copying files to remote machine...
1> 17:53:00: Finished copying files (elapsed time 00h:00m:02s:799ms).
1> /usr/local/bin/cmake -G "Unix Makefiles"  -DCMAKE_BUILD_TYPE="Debug" "\var\tmp\src\03967bd6-44be-4e31-b449-a34a45d7109d\Linux-Debug"
1> -- Conan ** WARNING** : This detection of settings from cmake is experimental and incomplete. Please check 'conan.cmake' and contribute
1> -- Conan executing: conan install /var/tmp/src/03967bd6-44be-4e31-b449-a34a45d7109d/Linux-Debug/conanfile.txt -g cmake -s build_type=Debug -s os=Linux -s compiler=gcc -s compiler.version=5 -s compiler.libcxx=libstdc++11 --build=missing
1> PROJECT: Installing /var/tmp/src/03967bd6-44be-4e31-b449-a34a45d7109d/Linux-Debug/conanfile.txt
1> Requirements
1>     OpenSSL/1.0.2l@conan/stable from 'conan-center'
1>     Poco/1.8.0@pocoproject/stable from 'conan-center'
1>     zlib/1.2.11@conan/stable from 'conan-center'
1> Packages
1>     OpenSSL/1.0.2l@conan/stable:f68b4e006611addfaec53a2f3d5c0e6b0406266d
1>     Poco/1.8.0@pocoproject/stable:e3d8f1070a587658375103e87fd35c8b5c372b6e
1>     zlib/1.2.11@conan/stable:15c6f8a55cbf8b39b86ca055629a91be1b2d3cf5
1> 
1> zlib/1.2.11@conan/stable: Already installed!
1> OpenSSL/1.0.2l@conan/stable: Already installed!
1> Poco/1.8.0@pocoproject/stable: Already installed!
1> PROJECT: Generator cmake created conanbuildinfo.cmake
1> PROJECT: Generator txt created conanbuildinfo.txt
1> PROJECT: Generated conaninfo.txt
1> -- Conan: Loading conanbuildinfo.cmake
1> -- Current conanbuildinfo.cmake directory: /var/tmp/build/03967bd6-44be-4e31-b449-a34a45d7109d/build/Linux-Debug
1> -- Conan: Compiler GCC>=5, checking major version 5
1> -- Conan: Checking correct version: 5
1> -- Conan: Using cmake targets configuration
1> -- Library PocoUtild found /root/.conan/data/Poco/1.8.0/pocoproject/stable/package/e3d8f1070a587658375103e87fd35c8b5c372b6e/lib/libPocoUtild.a
1> -- Library PocoMongoDBd found /root/.conan/data/Poco/1.8.0/pocoproject/stable/package/e3d8f1070a587658375103e87fd35c8b5c372b6e/lib/libPocoMongoDBd.a
1> -- Library PocoNetd found /root/.conan/data/Poco/1.8.0/pocoproject/stable/package/e3d8f1070a587658375103e87fd35c8b5c372b6e/lib/libPocoNetd.a
1> -- Library PocoNetSSLd found /root/.conan/data/Poco/1.8.0/pocoproject/stable/package/e3d8f1070a587658375103e87fd35c8b5c372b6e/lib/libPocoNetSSLd.a
1> -- Library PocoCryptod found /root/.conan/data/Poco/1.8.0/pocoproject/stable/package/e3d8f1070a587658375103e87fd35c8b5c372b6e/lib/libPocoCryptod.a
1> -- Library PocoDatad found /root/.conan/data/Poco/1.8.0/pocoproject/stable/package/e3d8f1070a587658375103e87fd35c8b5c372b6e/lib/libPocoDatad.a
1> -- Library PocoDataSQLited found /root/.conan/data/Poco/1.8.0/pocoproject/stable/package/e3d8f1070a587658375103e87fd35c8b5c372b6e/lib/libPocoDataSQLited.a
1> -- Library PocoZipd found /root/.conan/data/Poco/1.8.0/pocoproject/stable/package/e3d8f1070a587658375103e87fd35c8b5c372b6e/lib/libPocoZipd.a
1> -- Library PocoXMLd found /root/.conan/data/Poco/1.8.0/pocoproject/stable/package/e3d8f1070a587658375103e87fd35c8b5c372b6e/lib/libPocoXMLd.a
1> -- Library PocoJSONd found /root/.conan/data/Poco/1.8.0/pocoproject/stable/package/e3d8f1070a587658375103e87fd35c8b5c372b6e/lib/libPocoJSONd.a
1> -- Library PocoFoundationd found /root/.conan/data/Poco/1.8.0/pocoproject/stable/package/e3d8f1070a587658375103e87fd35c8b5c372b6e/lib/libPocoFoundationd.a
1> -- Library pthread not found in package, might be system one
1> -- Library dl not found in package, might be system one
1> -- Library rt not found in package, might be system one
1> -- Library ssl found /root/.conan/data/OpenSSL/1.0.2l/conan/stable/package/f68b4e006611addfaec53a2f3d5c0e6b0406266d/lib/libssl.a
1> -- Library crypto found /root/.conan/data/OpenSSL/1.0.2l/conan/stable/package/f68b4e006611addfaec53a2f3d5c0e6b0406266d/lib/libcrypto.a
1> -- Library dl not found in package, might be system one
1> -- Library z found /root/.conan/data/zlib/1.2.11/conan/stable/package/15c6f8a55cbf8b39b86ca055629a91be1b2d3cf5/lib/libz.a
1> -- Conan: Adjusting default RPATHs Conan policies
1> -- Conan: Adjusting language standard
1> -- Configuring done
1> -- Generating done
1> -- Build files have been written to: /var/tmp/build/03967bd6-44be-4e31-b449-a34a45d7109d/build/Linux-Debug
1> Starting CMake target info extraction ...
1> Extracted source files and headers.
1> Extracted global settings.
1> Extracted code model.
1> Collating data ...
1> Target info extraction done.

CMakeLists.txt 已更新

project(CppLinuxVS)
cmake_minimum_required(VERSION 3.1.2)
add_definitions("-std=c++11")

include(conan.cmake)
conan_cmake_run(CONANFILE conanfile.txt
                BASIC_SETUP CMAKE_TARGETS
                BUILD missing)

add_executable(CppLinuxVS Main.cpp)
target_link_libraries(CppLinuxVS ${CONAN_LIBS})

【问题讨论】:

  • 根据堆栈溢出规则,代码应该在问题帖子中,而不是链接。虽然conan.cmake 的内容可以被视为众所周知,但您的CMakeLists.txt 的内容却不是,因此应将其添加到问题帖子中。
  • 指定您遵循的步骤也很重要。您可能使用conan install 方法来获取依赖项,但是在哪里?用哪些设置? CMakeLists.txt 通常会在 ${CMAKE_BINARY_DIR} 文件夹中查找生成的 conanbuildinfo.cmake,但通过 CMake 集成,VS 将 binary-dir 文件夹放在其他位置。我建议在 CMakeLists.txt 中打印 ${CMAKE_BINARY_DIR},然后移动到该文件夹​​以执行 conan install。另外,考虑将问题提交到 github:github.com/conan-io/conan/issues
  • 由于您使用标志 CMAKE_TARGETS 调用 conan_cmake_run 您可能会尝试使用 target_link_libraries(CppLinuxVS CONAN_PKG::Poco) 而不是 target_link_libraries(CppLinuxVS ${CONAN_LIBS}) (小心你使用了 ${CONAN_LIST}
  • 此外,您不能将 CMake 目标与 CMake
  • 你解决了吗?我也面临同样的问题

标签: c++ cmake visual-studio-2017 conan


【解决方案1】:

@lusocoding 这是我设置的一个项目,用于演示 VS -> Cmake -> Conan 的工作组合。

https://github.com/solvingj/vs-cmake-conan-demo

其中一个关键部分(我记得)是 CMakeSettings.json,它应该是您通常不会提交给 git 的特定于机器的设置。但是,当时,我必须添加一些自定义项(我认为这是传递给 CMake 的 CLI 标志)才能使其正常工作。因此,我将该文件提交给 git 进行演示。

看看你能不能按原样克隆和使用项目,然后慢慢和你的项目比较,找出不同之处。

希望这会有所帮助。

【讨论】:

  • 感谢@solvingJ 的提示我能够克隆您的存储库并验证它工作正常,但是您的设置是针对 Windows 构建而不是 Linux,正如我试图做的那样。我遇到的问题似乎与此有关,因为一旦我将编译更改为以 Linux 为目标,即使您的存储库也停止工作。但同样感谢。你的仓库有很多有用的信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-09
  • 2021-12-15
  • 2023-03-11
  • 1970-01-01
相关资源
最近更新 更多