2017-09-04 10 views
1

私は変数があります。CMake - 絶対パスのリストを作成します。

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

から来ている:This Questionで議論の問題のため、私は相対的であることをこれらのパスのすべてを必要とするので

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} 
     ) 

を。

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

デフォルトでは、関数に設定されたすべての変数は外部には表示されません。 (つまり、変数の定義はで、スコープはです)。

関数の呼び出し側にmake変数を表示するには、set()コマンドのPARENT_SCOPEオプションを使用します。

など。あなたは、関数の最後に次の行を追加することによりexternal_libraries_relリスト「を公開する」ことがあります。

set(external_libraries_rel ${external_libraries_rel} PARENT_SCOPE) 
+0

Hum、今私はドキュメントを再読し、あなたは絶対に正しいです。 – arrowd

+0

@arrowd:なぜ自分の回答を削除したのですか?欠落したオプション(意図しないと思った)以外は、**宣言**のための良い方法を示し、何かを返す関数を実装します。 – Tsyvarev

+1

私のポストの主なポイントは 'PARENT_SCOPE'を省略していましたが、これは不可能であることが判明しました。 return argsを使って関数から戻ることについては、別の答えが必要だとは思わない。あなたが望むならば、あなたの投稿にそれを加えてください。 – arrowd