相关疑难解决方法(0)

config-file cmake包中变量的奇怪问题

我们可以使用cmake配置文件来导入目标。例如,给定的机械包括foob​​arConfig.cmake.in

set(FOOBAR_VERSION @VERSION@)

@PACKAGE_INIT@

set_and_check(FOOBAR_INCLUDE_DIR "@PACKAGE_INCLUDE_INSTALL_DIR@")
set_and_check(FOOBAR_LIBRARY_DIR "@PACKAGE_LIBRARY_INSTALL_DIR@")
set_and_check(FOOBAR_LIBRARY "@PACKAGE_LIBRARY_INSTALL_DIR@/libfoobar.so")
set_and_check(FOOBAR_STATIC_LIBRARY @PACKAGE_LIBRARY_INSTALL_DIR@/libfoobar.a")
include("${CMAKE_CURRENT_LIST_DIR}/FoobarLibTargets.cmake")

message(STATUS "foobar version: ${FOOBAR_VERSION}")
message(STATUS "foobar include location: ${FOOBAR_INCLUDE_DIR}")
message(STATUS "foobar library location: ${FOOBAR_LIBRARY_DIR}")
Run Code Online (Sandbox Code Playgroud)

用于导出的目标foobar

我们能做的:

find_package(foobar)

add_executable(usesfoo 
               usesfoo.cpp)
target_link_libraries(usesfoo
               ${FOOBAR_LIBRARY})
target_include_directories(usesfoo PUBLIC
               ${FOOBAR_INCLUDE_DIR})
Run Code Online (Sandbox Code Playgroud)

通常正常。但是,我遇到了一个棘手的情况,在find_package之后,Config.cmake中设置的变量不可用。例如给出:

find_package(foobar REQUIRED)
if (foobar_FOUND)
   message(STATUS "found foobar")
endif()

message(STATUS "foobar include location2: ${FOOBAR_INCLUDE_DIR}")
message(STATUS "foobar library location2: ${FOOBAR_LIBRARY_DIR}")
Run Code Online (Sandbox Code Playgroud)

输出为:

foobar include location: /test-import/opt/foobar/include
foobar library location: /test-import/opt/foobar/lib
found foobar
foobar include location2:
foobar library location2:
Run Code Online (Sandbox Code Playgroud)

这可能是怎么回事?

我怎么能够:

  • 发现这个问题?
  • 将来避免类似的问题吗?
  • 以安全规范的方式创建这些文件?

我对尝试调试感到非常困惑,并开始质疑Config程序包应该如何工作。我应该使用导入目标的属性而不是变量吗?find_package在什么范围内运行?我认为这就像一个include()而不是add_subdirectory(),它引入了自己的作用域。这些变量如何变为未设置状态?find_package到底是做什么的? …

cmake

5
推荐指数
1
解决办法
129
查看次数

标签 统计

cmake ×1