мой первый пакет conan не найден CMAKE?

#c #cmake #conan

#c #cmake #conan

Вопрос:

Похоже, я успешно создал свой первый локальный пакет conan и загрузил его в свой локальный артефакт.. Я также могу добавить его по полному имени в зависимости от других проектов, подобных so..

 [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 Я неправильно построил свой рецепт? Или мне просто нужно изменить способ ссылки на мой новый пакет conan в моем коде?

OtherProject / consumingHeader.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"]
  

#РЕДАКТИРОВАТЬ: вижу проблему с папкой includes

В соответствии с инструкциями я просмотрел свой conanbuildinfo.cmake и специально искал путь в разделе CONAN_INCLUDE_DIRS_MY-PKG

исходные файлы находятся в структуре папок, которую я не ожидал

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

когда меня ожидали, возможно

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

or

/../<conanhash>/MyPkgsHeader.h
  

Похоже, мне нужно немного изменить свой рецепт…

Комментарии:

1. Я бы рекомендовал проверить сгенерированный conanbuildinfo.cmake файл, а затем проверить в папках переменные INCLUDE_DIRS и проверить, действительно ли заголовки находятся внутри этой папки. Если это не так, я бы проверил процесс создания пакета ( test_package функциональность настоятельно рекомендуется для автоматизации этого). Вы можете начать с conan new hello/0.1 -s -t работающего и протестировать пакет, а затем настроить его для своего собственного кода.

2. Я действительно нашел свой INCLUDE_DIRS_MY-PKG .. зашел в папку… и обнаружил, что структура папок, возможно, не такая, какой она должна быть… Я думаю, мне нужно каким-то образом сделать корневую папку подпапкой с текущими настройками.. добавлю эту деталь сейчас в post

3. спасибо, дродри, я понял .. можете ли вы опубликовать это в основном о том, что мне пришлось изменить эту строку в моем рецепте, чтобы файлы копировались правильно? « self.copy(«*.h», dst =»include», src =»my-pkg /source / cppclient / client») ` `

Ответ №1:

Правильный процесс для отладки такого рода проблем заключается в следующем:

  • Проверьте сгенерированный файл conanbuildinfo.cmake, он будет содержать переменные типа CONAN_INCLUDE_DIRS, указывающие на папки в кэше Conan, которые должны содержать ожидаемые заголовки.
  • Если вы не можете определить переменные в conanbuildinfo.cmake, которые принадлежат вашей отсутствующей зависимости, возможно, вам не хватает a requires = "pkg/version..." в вашем рецепте, или выполнить conan install еще раз, чтобы извлечь эту зависимость и сгенерировать новый conanbuildinfo.cmake
  • Перейдите к этим папкам, проверьте, есть ли ожидаемые заголовки. Если это не так, кажется, что пакет был создан неправильно. Вам нужно вернуться к рецепту, который создал этот пакет, исправить его и выполнить conan create снова
  • Наиболее распространенными проблемами при упаковке конечных артефактов является неправильный шаблон или путь в self.copy() вызовах внутри package() метода. Для заголовков вызов будет примерно таким self.copy("*.h", dst="include", src="<path/to/headers>") , где src аргумент может быть неправильным.
  • Можно перейти в папку Conan cache и перейти внутрь после a conan create и вручную проверить, есть ли ожидаемые файлы.

Чтобы избежать проблем с неправильно созданными пакетами, очень рекомендуется использовать test_package функциональность. Короче говоря, это «потребительский» проект вместе с рецептом пакета, который будет автоматически запущен conan create , когда он установит соберет выполнит любое приложение, которое вы ему укажете, чтобы выполнить некоторые базовые проверки пакета и выполнить сбой как можно раньше, если это не правильно. Проверьте документы «test_package»