【问题标题】:my first conan package not getting found by CMAKE?我的第一个柯南包没有被 CMAKE 找到?
【发布时间】:2020-11-02 21:06:09
【问题描述】:

我似乎已经成功构建了我的第一个本地柯南包并将其上传到我的本地工件..我也可以在其他项目的依赖项中添加全名..

[requires]
thrift/0.13.0
mypkg/0.0.1@user/channel

[generators]
cmake

我可以在我的OtherProjectCMakeLists.txt 中毫无错误地链接它

cmake_minimum_required(VERSION 2.8.12)
project(OtherProject)
add_compile_options(-std=c++11)

# Using the "cmake" generator
include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)
conan_basic_setup(TARGETS)

add_executable(OtherProject src/Main.cpp)
target_link_libraries(OtherProject CONAN_PKG::my-pkg)

但是当我尝试在我的消费项目的 C++ 中引用它时,它找不到 mypkg.a 文件或我希望它可用的任何标题?我是否错误地构建了我的食谱?还是我只需要更改在代码中引用新柯南包的方式?

OtherProject/sumptionHeader.H

#pragma once
#include "MyPkgsHeader.h"

构建错误

> cmake --build .
Scanning dependencies of target OtherProject
[ 50%] Building CXX object CMakeFiles/OtherProject.dir/src/Main.cpp.o
In file included from /OtherProject/src/Main.cpp:12:
/OtherProject/src/TestCppClient.h:8:10: fatal error: 'MyPkgsHeader.h' file not found
#include "MyPkgsHeader.h"
         ^~~~~~~~~~~~~~~~~~~~
1 error generated.
make[2]: *** [CMakeFiles/OtherProject.dir/src/Main.cpp.o] Error 1
make[1]: *** [CMakeFiles/OtherProject.dir/all] Error 2
make: *** [all] Error 2

MyPkg 食谱 conanfile.py

from conans import ConanFile, CMake, tools


class MyPkgConan(ConanFile):
    name = "mypkg"
    version = "0.0.1"
    license = "<Put the package license here>"
    author = "<Put your name here> <And your email here>"
    url = "<Package recipe repository url here, for issues about the package>"
    description = "<Description of mypkg here>"
    topics = ("<Put some tag here>", "<here>", "<and here>")
    settings = "os", "compiler", "build_type", "arch"
    options = {"shared": [True, False]}
    default_options = {"shared": False}
    generators = "cmake"

    def source(self):
        self.run("git clone --depth 1 --branch 0.0.1 git@github.com:PROJECT/my-pkg.git")

        tools.replace_in_file("my-pkg/CMakeLists.txt", "         LANGUAGES CXX )",
                              '''         LANGUAGES CXX )
add_compile_options(-std=c++11)''')

    def build(self):
        cmake = CMake(self)
        cmake.configure(source_folder="my-pkg")
        cmake.build()

        # Explicit way:
        # self.run('cmake %s/hello %s'
        #          % (self.source_folder, cmake.command_line))
        # self.run("cmake --build . %s" % cmake.build_config)

    def package(self):
        self.copy("*.h", dst="include", src="my-pkg")
        self.copy("*hello.lib", dst="lib", keep_path=False)
        self.copy("*.dll", dst="bin", keep_path=False)
        self.copy("*.so", dst="lib", keep_path=False)
        self.copy("*.dylib", dst="lib", keep_path=False)
        self.copy("*.a", dst="lib", keep_path=False)

    def package_info(self):
        self.cpp_info.libs = ["mypkg"]

#EDIT:看到包含文件夹的问题

按照指示,我查看了我的conanbuildinfo.cmake,并专门寻找CONAN_INCLUDE_DIRS_MY-PKG下的路径

源文件位于我没想到的文件夹结构中

/../<conanhash>/include/source/cppclient/client/MyPkgsHeader.h

也许在我预料到的时候

/../<conanhash>/client/MyPkgsHeader.h

or

/../<conanhash>/MyPkgsHeader.h

听起来我需要稍微改变一下我的食谱......

【问题讨论】:

  • 我建议检查生成的conanbuildinfo.cmake 文件,然后检查文件夹的 INCLUDE_DIRS 变量,并检查标题是否实际上在该文件夹中。如果不是,我会检查包创建过程(强烈建议使用test_package 功能来自动执行此操作)。你可以从一个可以工作的conan new hello/0.1 -s -t 开始测试包,然后为你自己的代码定制它。
  • 我确实找到了我的INCLUDE_DIRS_MY-PKG .. 进入文件夹... 发现文件夹结构可能不是它应该的... 我想我需要以某种方式制作根文件夹它当前设置的子文件夹.. 现在将添加此详细信息以发布
  • 谢谢你,drodri,我明白了.. 你能发布这个基本上我必须在我的食谱中更改这一行才能以正确的方式复制文件吗? ``` self.copy("*.h", dst="include", src="my-pkg/source/cppclient/client") ```

标签: c++ cmake conan


【解决方案1】:

调试此类问题的正确过程如下:

  • 检查生成的 conanbuildinfo.cmake 文件,它将包含变量,如 CONAN_INCLUDE_DIRS 指向柯南缓存中的文件夹,应该包含预期的标题。
  • 如果您无法识别 conanbuildinfo.cmake 中属于您缺少的依赖项的变量,则可能是您的配方中缺少requires = "pkg/version...",或者再次执行conan install获取该依赖项并生成一个新的 conanbuildinfo.cmake
  • 导航到这些文件夹,检查预期的标题是否存在。如果不是,则似乎是错误地创建了包。您需要返回创建该包的配方,修复它并再次执行 conan create
  • 打包最终工件时最常见的问题是package() method 内的self.copy() 调用中的一些错误模式或路径。对于标头,调用类似于self.copy("*.h", dst="include", src="&lt;path/to/headers&gt;"),其中src 参数可能是错误的。
  • 可以转到 Conan 缓存文件夹并在 conan create 之后导航并手动检查预期文件是否存在。

为了避免错误创建包的问题,​​非常推荐使用test_package功能。简而言之,它是一个“消费者”项目,连同将在conan create 时自动触发的包配方,它将安装+构建+执行您告诉它的任何应用程序,以对包进行一些基本检查并失败为如果不正确,请尽早。检查"test_package" docs

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-15
    • 1970-01-01
    • 1970-01-01
    • 2021-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多