【问题标题】:Creating conan test_package recipe创建柯南 test_package 配方
【发布时间】:2019-11-15 17:18:19
【问题描述】:

我现在在玩柯南。所以我创建了两个小项目: 第一个项目是一个小型库“fcdk”:https://github.com/lmarzull/fcdk/tree/devel

第二个是包含 conan 和 circle-ci 的项目(还不知道我是否应该将 library/conan/circle-ci 组合到一个项目中,但这还不是重点)。 第二个项目叫做“fcdk-conan”

我决定将库的单元测试放在“test_package”目录下的 fcdk-conan 项目中。我这样做是为了避免在我的“fcdk”库中依赖于 google 测试,而是在 fcdk-conan 项目中拥有这种依赖关系(不知道这是否是个好主意)

我创建了一个非常简单的测试程序:

#include <iostream>

int
main()
{
  std::cout << "Hello, world!" << std::endl;
}

一切都很好。

但是现在,我想为我的库添加一些单元测试。所以我需要找到/编译/链接“fcdk”库。所以我把 main.cc 文件改成这个:

#include <iostream>
#include <fcdk/CommandLineOptionFlag.h>

int
main()
{
  FCDK::CommandLineOptionFlag show_help('h', "help", "show this help message");
  std::cout << "Hello, world!" << std::endl;
}

这里是test_package目录的CMakeLists.txt:

cmake_minimum_required(VERSION 3.2)
project(FcdkTest CXX)


include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)
conan_basic_setup(TARGETS)


add_executable(
  test-fcdk
  main.cc
)
target_include_directories(test-fcdk PUBLIC ${CONAN_INCLUDE_DIRS_FCDK})
target_link_libraries(test-fcdk PUBLIC ${CONAN_LIBS_FCDK})
target_link_libraries(test-fcdk PUBLIC CONAN_PKG::fcdk)

enable_testing()
add_test(NAME test-fcdk
         WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/bin
         COMMAND test-fcdk)

还有柯南食谱:

import os
from conans import ConanFile, CMake, tools


class FcdkTestConan(ConanFile):
    settings = "os", "compiler", "build_type", "arch"
    generators = "cmake"
    requires = "fcdk/1.0.0"

    def build(self):
        cmake = CMake(self)
        cmake.configure()
        cmake.build()

    def test(self):
        if not tools.cross_building(self.settings):
            os.chdir("bin")
            self.run(".%stest-fcdk" % os.sep)

我无法正确链接 test_package。

CMakeFiles/test-fcdk.dir/main.cc.o: In function `FCDK::CommandLineOptionFlag::accept(FCDK::VisitorBase&)':
main.cc:(.text._ZN4FCDK21CommandLineOptionFlag6acceptERNS_11VisitorBaseE[_ZN4FCDK21CommandLineOptionFlag6acceptERNS_11VisitorBaseE]+0xa1): undefined reference to `FCDK::demangleTypename(char const*)'
main.cc:(.text._ZN4FCDK21CommandLineOptionFlag6acceptERNS_11VisitorBaseE[_ZN4FCDK21CommandLineOptionFlag6acceptERNS_11VisitorBaseE]+0xdd): undefined reference to `FCDK::demangleTypename(char const*)'
CMakeFiles/test-fcdk.dir/main.cc.o: In function `main':
main.cc:(.text.startup+0x5e): undefined reference to `FCDK::CommandLineOptionFlag::CommandLineOptionFlag(char, std::string, std::string)'

上一步:

conan source 
conan install
conan build
conan package
conan export-pkg

很好,对我来说似乎是正确的。我把柯南包命令的内容放在这里:

package/
package/conaninfo.txt
package/include
package/include/fcdk
package/include/fcdk/Exception.h
package/include/fcdk/CommandLineOption.h
package/include/fcdk/CommandLineOptionWithValue.h
package/include/fcdk/Visitor.h
package/include/fcdk/ABI.h
package/include/fcdk/CommandLineParser.h
package/include/fcdk/CommandLineOptionFlag.h
package/conanmanifest.txt
package/lib
package/lib/libfcdk.a
package/share
package/share/cmake
package/share/cmake/fcdk
package/share/cmake/fcdk/fcdkTargets.cmake
package/share/cmake/fcdk/fcdkTargets-release.cmake

我还查看了 libfcdk.a 中缺少的符号 例如:

                 U FCDK::demangleTypename[abi:cxx11](char const*)
                 U FCDK::demangleTypename[abi:cxx11](char const*)
0000000000000000 t _GLOBAL__sub_I__ZN4FCDK16demangleTypenameB5cxx11EPKc
0000000000000000 T FCDK::demangleTypename[abi:cxx11](char const*)

当我使用 VERBOSE=1 运行 make 时,我在链接命令中看不到 fcdk 库信息

/usr/bin/cmake -E cmake_link_script CMakeFiles/test-fcdk.dir/link.txt --verbose=1
/usr/bin/c++   -m64 -O3 -DNDEBUG  -rdynamic CMakeFiles/test-fcdk.dir/main.cc.o  -o bin/test-fcdk 
CMakeFiles/test-fcdk.dir/main.cc.o: In function `FCDK::CommandLineOptionFlag::accept(FCDK::VisitorBase&)':

有人可以帮我弄清楚为什么 test_pacakge 配方没有链接到我的 fcdk/1.0.0 包吗?

非常感谢

编辑:更新了 test_pacakge 的柯南存储库 https://github.com/lmarzull/fcdk-conan/tree/devel

【问题讨论】:

  • 看来conan_basic_setup() 调用没有填充您的CONAN_PKG::fcdk CMake 目标。
  • 能否请您将带有测试包的源代码发布到 github 上?您的存储库不包含您在此处提到的测试包
  • @ymochurad:我已经用 github 上的“fcdk-conan”存储库的链接编辑了我的问题。谢谢
  • 我认为您需要使用self.cpp_info.libdirsself.cpp_info.libs 在主conanfile 中声明要链接到的库。更多细节在这里:docs.conan.io/en/latest/reference/conanfile/…
  • @ymochurad:谢谢!!

标签: c++ cmake conan


【解决方案1】:

首先,非常感谢@ymochurad

他指点我用给定库的名称填充 self.cpp_info.libs。

但是这已经完成了,故事还在继续。我需要修改

test_package/CMakeLists.txt test_package/conanfile.py

# conanfile.py
def package_info(self):
  self.cpp_info.libs = [ "fcdk" ]

# test_package/CMakeLists.txt
FIND_PACKAGE(fcdk REQUIRED)

# remove conan_basic_setup(TARGETS)
# and replace with:
conan_basic_setup()

# Add ${CONAN_INCLUDE_DIRS}
target_include_directories(test-fcdk
  PRIVATE ${CONAN_INCLUDE_DIRS})

# and also fcdk_LIBRARIES in link directive
target_link_libraries(test-fcdk ${fcdk_LIBRARIES})

# test_package/conanfile.py
def config_options(self):
  self.settings.compiler.libcxx = "libstdc++11"

所有这些修改都解决了最初的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多