如何删除cmake TARGET_OBJECTS的“:”,并在自定义命令中使用它

时间:2019-05-08 15:58:53

标签: cmake

我想在COMMAND ld中使用objs,但是我不能删除“;”在objs中。

如何删除“;”?

或还有其他解决方法?

CMakeLists.txt

SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fvisibility=hidden")
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=hidden")

set(SOURCES
  lib1_public.h
  lib1_public.cpp
  lib.h
  lib.c)

add_library(objlib1 OBJECT ${SOURCES})

set(objs_list  "$<TARGET_OBJECTS:objlib1>")
string(REPLACE ";" " " myobjs "${objs_list}")


add_custom_command(
  OUTPUT  lib1_hidden.o
  COMMAND ld -r "${myobjs}" -o lib1.o
  COMMAND objcopy --localize-hidden lib1.o lib1_hidden.o
  COMMENT "Building mylib1.a")


add_library(mylib1 STATIC lib1_hidden.o)

输出

[100%] Building mylib1.a cd /home/yongle.xh/tmp/cmake_test/lib/lib1 && ld -r /home/yongle.xh/tmp/cmake_test/lib/lib1/CMakeFiles/objlib1.dir/lib1_public.cpp.o;/home/yongle.xh/tmp/cmake_test/lib/lib1/CMakeFiles/objlib1.dir/lib.c.o -o lib1.o

2 个答案:

答案 0 :(得分:0)

$<TARGET_OBJECTS:objlib1>是一个生成器表达式(也称为“ genex”),这意味着它仅在生成时间进行评估:,在CMake处理所有输入文件并开始生成构建系统之后。当CMake仍在处理输入时,它是一个文字字符串。因此,您的string(REPLACE)无效,因为字符串$<TARGET_OBJECTS:objlib1>不包含任何分号。

但是,我认为您实际上并不需要以任何方式删除它们。导致它们出现在命令行中的原因是您引用了myobjsCOMMAND的扩展名,这意味着“在Genex扩展后将此列表作为命令的单个参数进行处理。 ”那很可能不是您想要的。要将对象作为每个参数传递,只需删除引号(以及不需要的string命令):

SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fvisibility=hidden")
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=hidden")

set(SOURCES
  lib1_public.h
  lib1_public.cpp
  lib.h
  lib.c)

add_library(objlib1 OBJECT ${SOURCES})

add_custom_command(
  OUTPUT  lib1_hidden.o
  COMMAND ld -r $<TARGET_OBJECTS:objlib1> -o lib1.o
  COMMAND objcopy --localize-hidden lib1.o lib1_hidden.o
  COMMENT "Building mylib1.a")

add_library(mylib1 STATIC lib1_hidden.o)

答案 1 :(得分:0)

我相信这里缺少的是 COMMAND_EXPAND_LISTS 中的 add_custom_command 选项。尝试一些类似的东西

add_custom_command(
  OUTPUT  lib1_hidden.o
  COMMAND ld -r $<TARGET_OBJECTS:objlib1> -o lib1.o
  COMMAND objcopy --localize-hidden lib1.o lib1_hidden.o
  COMMENT "Building mylib1.a"
  COMMAND_EXPAND_LISTS)