CMake - 制作绝对路径列表。
CMake - Make a list of paths absolute.
我有一个变量:
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})
时,我得到了与我尝试 link 的库相关的所有函数的未定义引用错误。表明图书馆实际上还没有 linked.
我的makeLibPathsAbsolute()
函数正确吗?
默认情况下,函数中设置的所有变量在外部都是不可见的。 (换句话说,变量的定义是作用域函数)。
要使变量对函数的调用者可见,请使用 set() 命令的 PARENT_SCOPE 选项。
例如您可以 "publish" external_libraries_rel
通过将此行附加到函数末尾来列出:
set(external_libraries_rel ${external_libraries_rel} PARENT_SCOPE)
我有一个变量:
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})
时,我得到了与我尝试 link 的库相关的所有函数的未定义引用错误。表明图书馆实际上还没有 linked.
我的makeLibPathsAbsolute()
函数正确吗?
默认情况下,函数中设置的所有变量在外部都是不可见的。 (换句话说,变量的定义是作用域函数)。
要使变量对函数的调用者可见,请使用 set() 命令的 PARENT_SCOPE 选项。
例如您可以 "publish" external_libraries_rel
通过将此行附加到函数末尾来列出:
set(external_libraries_rel ${external_libraries_rel} PARENT_SCOPE)