【问题标题】:Is it possible to call a custom CMake function when library is linked?链接库时是否可以调用自定义 CMake 函数?
【发布时间】:2021-12-10 23:53:19
【问题描述】:

假设我有一个库 A 和一个使用 A 的项目 B

project(libA)

function(calledWhenLink target)
    message(STATUS Hi ${target}) # Should print "Hi exeB"
endfunction()

add_library(libA INTERFACE)
project(exeB)

find_package(A REQUIRED)
target_link_library(exeB libA)

可执行文件链接到库时是否可以自动调用calledWhenLink()

推理:正如评论中所说,原来的问题是VTK需要调用CMake vtk_module_autoinit。我的库使用 VTK,所有示例在链接到 lib 时自动调用它似乎更好,而不是复制粘贴每个 CMakeLists 中的代码。问题是 vtk_module_autoinit 在我的测试中使用 lib 目标而不是 exe 调用时不起作用。

【问题讨论】:

  • 我对此表示怀疑,但您始终可以创建自己的 link_with_libA 函数来执行对 target_link_library 的调用以及您需要的任何特殊行为。
  • 无论如何我都会使用自定义函数。
  • 听起来像是 XY 问题。你到底想达到什么目的?
  • VTK 需要调用 CMake vtk_module_autoinit。我的库使用 VTK,所有示例在链接到 lib 时自动调用它似乎更好,而不是复制粘贴每个 CMakeLists 中的代码。问题是 vtk_module_autoinit 在我的测试中使用 lib 目标而不是 exe 调用时不起作用。

标签: cmake


【解决方案1】:

是的,可以在构建时运行任意 CMake 代码。但是,完全不清楚您真正想要做什么,因此这可能不是一个好方法。

这是一个最小的例子:

cmake_minimum_required(VERSION 3.21)
project(example)

file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/post-link.cmake" [[
message(STATUS "Hi ${target}")
]])

add_executable(exeB main.cpp)
add_custom_command(
  TARGET exeB POST_BUILD
  COMMAND "${CMAKE_COMMAND}"
          -Dtarget=exeB
          -P "${CMAKE_CURRENT_BINARY_DIR}/post-link.cmake" 
)

测试交互:

alex@alex-ubuntu:~/test$ cmake -G Ninja -S . -B build
-- The C compiler identification is GNU 9.3.0
-- The CXX compiler identification is GNU 9.3.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /usr/bin/cc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/alex/test/build
alex@alex-ubuntu:~/test$ cmake --build build/ --verbose
[1/2] /usr/bin/c++    -MD -MT CMakeFiles/exeB.dir/main.cpp.o -MF CMakeFiles/exeB.dir/main.cpp.o.d -o CMakeFiles/exeB.dir/main.cpp.o -c /home/alex/test/main.cpp
[2/2] : && /usr/bin/c++   CMakeFiles/exeB.dir/main.cpp.o -o exeB   && cd /home/alex/test/build && /usr/bin/cmake -Dtarget=exeB -P /home/alex/test/build/post-link.cmake
-- Hi exeB

【讨论】:

  • 编译时间肯定为时已晚调用vtk_module_autoinitCMake函数,添加包含目录、编译定义等。
猜你喜欢
  • 2022-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-22
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多