微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我的第一个柯南包装没有被CMAKE找到?

如何解决我的第一个柯南包装没有被CMAKE找到?

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

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

[generators]
cmake

我可以在我的OtherProject CMakeLists.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 / usingHeader.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",keep_path=False)
        self.copy("*.dylib",keep_path=False)
        self.copy("*.a",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 文件,该文件将包含诸如CONAN_INCLUDE_DIRS之类的变量,该变量指向Conan缓存中的文件夹,其中应包含预期的标题。
  • 如果您无法在 conanbuildinfo.cmake 中标识属于您缺少的依赖项的变量,则可能是您的食谱中缺少了requires = "pkg/version..."或要执行{{ 1}},以获取该依赖关系并生成一个新的 conanbuildinfo.cmake
  • 导航到那些文件夹,检查是否存在预期的标题。如果不是,则表明该软件包创建不正确。您需要返回创建该程序包的方法,对其进行修复,然后再次执行conan install
  • 在打包最终工件时,最常见的问题是package() method内部conan create调用中的某些错误模式或路径。对于标题,调用类似于self.copy(),其中self.copy("*.h",dst="include",src="<path/to/headers>")参数可能是错误的。
  • 可以在src之后转到Conan缓存文件夹并在其中导航,并手动检查期望的文件是否存在。

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。