【问题标题】:CMake - Make a list of paths absolute.CMake - 制作绝对路径列表。
【发布时间】:2017-09-04 17:09:49
【问题描述】:

我有一个变量:

set(${PROJECT_NAME}_EXTERNAL_LIBRARIES
        ${PocoNetExternal_LIBRARIES}
)

来自:

set(EXTERNAL_NAME PocoNetExternal)
    set(${EXTERNAL_NAME}_LIBRARIES
        ${PROJECT_BINARY_DIR}/${EXTERNAL_NAME}/Foundation/${CMAKE_SHARED_LIBRARY_PREFIX}PocoFoundation${POCO_build_postfix}${CMAKE_STATIC_LIBRARY_SUFFIX}
        ${PROJECT_BINARY_DIR}/${EXTERNAL_NAME}/Util/${CMAKE_SHARED_LIBRARY_PREFIX}PocoUtil${POCO_build_postfix}${CMAKE_STATIC_LIBRARY_SUFFIX}
        ${PROJECT_BINARY_DIR}/${EXTERNAL_NAME}/Net/${CMAKE_SHARED_LIBRARY_PREFIX}PocoNet${POCO_build_postfix}${CMAKE_STATIC_LIBRARY_SUFFIX}
       )

由于This Question 中讨论的问题,我需要所有这些路径都是相对的。

我试过这个:

function(makeLibPathsAbsolute)

    set(temp ${${PROJECT_NAME}_EXTERNAL_LIBRARIES})    #rename list
    set(external_libraries_rel)                        #make empty list

    list(LENGTH temp len1)                 #len1 is length of temp list
    math(EXPR len2 "${len1} - 1")           #len2 is len1 - 1

    foreach(val RANGE ${len2})                                 #for val = 0 to len2
        list(GET temp ${val} relPath)                         #relPath becomes the {val} entry of temp
        get_filename_component(absPath ${relPath} ABSOLUTE)   #make relPath Absolute and call it absPath
        list(APPEND external_libraries_rel ${absPath})        #Append this to the external_libraries_rel list
    endforeach()

endfunction()

但是当我使用target_link_libraries(${name} ${external_libraries_rel}) 时,我得到一个与我试图链接的库相关的所有函数的未定义引用错误。表示该库实际上尚未链接。

我的makeLibPathsAbsolute() 函数正确吗?

【问题讨论】:

  • 你似乎没有从你的函数中返回任何东西。你能检查传递给target_link_libraries 的变量不为空吗?

标签: path cmake shared-libraries


【解决方案1】:

默认情况下,函数中设置的所有变量在外部都是不可见的。 (换句话说,变量的定义是作用域的函数)。

要使变量对函数的调用者可见,请使用set() 命令的PARENT_SCOPE 选项。

例如您可以通过将此行附加到函数末尾来“发布”external_libraries_rel 列表:

set(external_libraries_rel ${external_libraries_rel} PARENT_SCOPE)

【讨论】:

  • @arrowd:你为什么要删除你自己的答案?除了错过的选项(我认为这是无意的)之外,它显示了 declare 和实现应该返回某些内容的函数的好方法。
  • 我帖子的重点是省略了PARENT_SCOPE,但事实证明这是不可能的。至于使用 return args 从函数返回 - 我认为这不值得单独回答。如果您愿意,只需将其添加到您的帖子中即可。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-18
  • 2012-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-04
  • 1970-01-01
相关资源
最近更新 更多