繁体   English   中英

如何在 cmake 中构建参数化的第三方库?

[英]How do I build a parameterized third-party library in cmake?

我有一个项目,其中我有一个第三方库作为 git 子模块签出。 第三方库只是没有构建系统的源代码。 此外,第三方库必须通过编译器定义在每个可执行的基础上进行配置,并有选择地只编译我需要的库的部分。 我在很多不同的存储库中使用这个库,所以我想制作一个可重用的组件来为任何特定的可执行文件生成库的实例化。

我目前尝试的方法是创建一个generate_thirdparty.cmake<\/code> 。 这个文件看起来像这样:

function(generate_thirdparty parameters)
    # several calls to add_library for the different components of this third party library
    # the generated libraries depend on the parameters argument
    # the parameters configure compile definitions and which source files are compiled
endfunction()

让我们总结一下:

  1. 第三方库不<\/em>提供自己的构建。<\/li>
  2. 您需要在单个构建中对库进行许多实例化。<\/li>
  3. 您可以在多个不同的存储库中使用这些实例化。<\/li><\/ol>

    我认为你几乎采取了正确的方法。 为简洁起见,我们将第三方库libFoo<\/code> 。 这是我认为你应该做的...

    1. libFoo<\/code>创建一个包装<\/em>存储库,其中包含一个FindFoo.cmake<\/code>文件和它旁边的实际foo<\/code>存储库子模块。 这是为了避免FindFoo.cmake<\/code>的内容在您的各个项目中独立进行版本控制。<\/li>
    2. 包装器<\/em>作为子模块包含在依赖项目中,例如在目录third_party\/foo_wrapper<\/code><\/li>
    3. 在那些依赖项目中,写:<\/li><\/ol>
       FindFoo.cmake<\/code>的内容将是:<\/li><\/ol>
       cmake_minimum_required(VERSION 3.18) function(generate_foo target) # Use CMAKE_CURRENT_FUNCTION_LIST_DIR to reference foo's source files # for example: set(sources "src\/src1.cpp" "src\/src2.cpp" ...) list(TRANSFORM sources PREPEND "${CMAKE_CURRENT_FUNCTION_LIST_DIR}\/foo\/") add_library(${target} ${sources}) add_library(foo::${target} ALIAS ${target}) # Do other things with ARGN endfunction() # Define a version for this dependency + script combo. set(Foo_VERSION 0.1.0) include(FindPackageHandleStandardArgs) find_package_handle_standard_args(Foo VERSION_VAR Foo_VERSION HANDLE_COMPONENTS)<\/code><\/pre>

      CMAKE_CURRENT_FUNCTION_LIST_DIR<\/code>是包含被调用函数的文件的绝对路径。 请记住,这是包装<\/em>存储库的根目录,因此libFoo<\/code>的实际源代码将位于相邻的foo<\/code>目录中。 list(TRANSFORM)<\/code>让我们在源列表中写入相对路径,这些相对路径为了add_library<\/code>而被转换为绝对路径(将相对路径传递给add_library<\/code>将相对于调用者的<\/em>源目录)。

      我还创建了一个ALIAS<\/code>目标,以便generate_foo<\/code>的调用者可以链接到别名。 这很重要,因为 CMake 将包含::<\/code>的名称视为预期库时的目标。 这非常有助于将意外链接器标志中的拼写错误转变为配置时“未找到目标”错误。

      然后我们像正常一样定义函数并调用find_package_handle_standard_args<\/code>来处理find_package<\/code>参数,如REQUIRED<\/code> 、 COMPONENTS<\/code> (甚至只是检查没有错误指定)和VERSION<\/code> 。 在此处查看文档: https<\/a> :\/\/cmake.org\/cmake\/help\/latest\/module\/FindPackageHandleStandardArgs.html

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM