45

CMake リストは基本的にセミコロンで区切られた単なる文字列ですが、そのような変数をコマンドに渡すと、複数の引数に展開されます。たとえば、

set(FLAGS f1 f2 f3)
# now FLAGS == 'f1;f2;f3'
add_custom_command(
  ...
  COMMAND my_cmd ${FLAGS}
  ...
)

を正しく呼び出しますmy_cmd f1 f2 f3

今私がこれを行うと

set_target_properties(
  myTarget PROPERTIES
  LINK_FLAGS  "${LD_FLAGS}"
)

展開は行われず、スペースで区切られた文字列に展開する代わりに、セミコロンを含む単一の LD_FLAG になります。

LINK_FLAGS プロパティ (またはそのプロパティ) にリストを渡すと、1 つではなく複数の引数に展開されるようにする方法はありますか?

ありがとう、ダン

4

6 に答える 6

28

set_target_properties自動的に展開できるとは思いませんがstring (REPLACE ...)、リストをスペースで区切られた文字列に展開するために使用できます。

string (REPLACE ";" " " LD_FLAGS_STR "${LD_FLAGS}")
set_target_properties(
  myTarget PROPERTIES
  LINK_FLAGS  "${LD_FLAGS_STR}"
)
于 2012-07-21T20:02:19.070 に答える
17

リストとしてcmakeリストを使用するには、使用します

${LD_FLAG}

cmake リストを文字列として使用するには (つまり、リスト項目は「;」で区切られます)、次を使用します。

"${LD_FLAG}"

したがって、あなたの場合は、「」を削除するだけで十分です。

于 2014-08-05T02:50:51.503 に答える
1

紐のように使う

set(FLAGS " f1 f2 f3")

先頭のスペースに注意してください。これにより、他のフラグ セットを連結できます。

より複雑なプロジェクトでは、if-else の代わりに、二重展開のトリックを行うこともできます。

set(GCC_FLAGS " -Wl,--relax")
set(DIAB_FLAGS " -tPPCE500ES:cross")
set(MSVC_FLAGS " /RAINBOW_CRAP)
# ...
# ...LINUX_FLAGS, WINDOWS_FLAGS, etc...


set_target_properties(
  myTarget PROPERTIES
  LINK_FLAGS  "${${COMPILER}_FLAGS} ${${SYSTEM}_FLAGS}"
)

# COMPILER and SYSTEM is set somewhere else, in toolchain files for example
于 2013-06-11T08:42:58.847 に答える