我的第一个柯南包没有被 CMAKE 找到?
my first conan package not getting found by CMAKE?
我似乎已经成功构建了我的第一个本地 conan 包并将其上传到我的本地工件..我也可以像这样在其他项目的依赖项中通过全名添加它..
[requires]
thrift/0.13.0
mypkg/0.0.1@user/channel
[generators]
cmake
我可以 link 它没有错误就像我的 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
文件或任何我希望它可用的 headers 文件?我是否错误地构建了我的食谱?还是我只需要更改我在代码中引用新柯南包的方式?
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"]
#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 之类的变量,指向柯南缓存中的文件夹,应该包含预期的 headers.
- 如果您无法识别 conanbuildinfo.cmake 中属于您缺少的依赖项的变量,可能是您缺少
requires = "pkg/version..."
配方,或再次执行 conan install
以获取该依赖项并生成新的 conanbuildinfo.cmake
- 导航到这些文件夹,检查是否存在预期的 headers。如果不是,则似乎包创建不正确。您需要返回创建该包的配方,修复它并再次执行
conan create
- 打包最终工件时最常见的问题是
package()
method 中 self.copy()
调用中的一些错误模式或路径。对于 headers,调用类似于 self.copy("*.h", dst="include", src="<path/to/headers>")
,其中 src
参数可能是错误的。
- 可以在
conan create
之后转到 Conan 缓存文件夹并在其中导航,然后手动检查是否存在预期的文件。
为了避免错误创建包的问题,非常推荐使用test_package
功能。简而言之,它是一个“消费者”项目,连同将在 conan create
时自动触发的包配方,它将安装+构建+执行你告诉它的任何应用程序,对包进行一些基本检查和如果不正确,请尽早失败。检查 "test_package" docs
我似乎已经成功构建了我的第一个本地 conan 包并将其上传到我的本地工件..我也可以像这样在其他项目的依赖项中通过全名添加它..
[requires]
thrift/0.13.0
mypkg/0.0.1@user/channel
[generators]
cmake
我可以 link 它没有错误就像我的 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
文件或任何我希望它可用的 headers 文件?我是否错误地构建了我的食谱?还是我只需要更改我在代码中引用新柯南包的方式?
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"]
#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 之类的变量,指向柯南缓存中的文件夹,应该包含预期的 headers.
- 如果您无法识别 conanbuildinfo.cmake 中属于您缺少的依赖项的变量,可能是您缺少
requires = "pkg/version..."
配方,或再次执行conan install
以获取该依赖项并生成新的 conanbuildinfo.cmake - 导航到这些文件夹,检查是否存在预期的 headers。如果不是,则似乎包创建不正确。您需要返回创建该包的配方,修复它并再次执行
conan create
- 打包最终工件时最常见的问题是
package()
method 中self.copy()
调用中的一些错误模式或路径。对于 headers,调用类似于self.copy("*.h", dst="include", src="<path/to/headers>")
,其中src
参数可能是错误的。 - 可以在
conan create
之后转到 Conan 缓存文件夹并在其中导航,然后手动检查是否存在预期的文件。
为了避免错误创建包的问题,非常推荐使用test_package
功能。简而言之,它是一个“消费者”项目,连同将在 conan create
时自动触发的包配方,它将安装+构建+执行你告诉它的任何应用程序,对包进行一些基本检查和如果不正确,请尽早失败。检查 "test_package" docs