2017-09-04 89 views
1

我有一个变量:CMake - 制作绝对路径列表。

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()功能是否正确?

+0

你似乎没有从你的函数返回任何东西。你能检查传递给'target_link_libraries'的变量是否为空? – arrowd

回答

2

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

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

E.g.您可以通过附加此行到函数结束“发布” external_libraries_rel名单:

set(external_libraries_rel ${external_libraries_rel} PARENT_SCOPE) 
+0

嗯,现在我重新阅读文档,你是绝对正确的。 – arrowd

+0

@arrowd:你为什么删除了自己的答案?除了错过选项(我认为它是无意的),它显示了**声明**和实现函数应该返回的东西的好方法。 – Tsyvarev

+1

我在文章中的要点是省略了'PARENT_SCOPE',但事实证明这是不可能的。至于从使用返回参数的函数返回 - 我不认为这是值得一个单独的答案。只要将它添加到您的帖子中,如果您愿意的话。 – arrowd