как удалить ":" из cmake TARGET_OBJECTS и использовать его в пользовательской команде - PullRequest
0 голосов
/ 08 мая 2019

Я хочу использовать objs в COMMAND ld, но я не могу удалить ";" в объективах.

Как я могу удалить ";"?

или есть другой способ это исправить?

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

1 Ответ

0 голосов
/ 08 мая 2019

$<TARGET_OBJECTS:objlib1> - это выражение генератора (также называемое «genex»), что означает, что оно оценивается только в время генерации: после того, как CMake обработал все свои входные файлы и начал генерировать систему сборки. Пока CMake все еще обрабатывает ввод, это буквальная строка. Поэтому ваш string(REPLACE) не может иметь никакого эффекта, потому что строка $<TARGET_OBJECTS:objlib1> не содержит точек с запятой.

Однако я не думаю, что вам на самом деле нужно их каким-либо образом удалять. Что заставляет их появляться в командной строке, так это то, что вы цитируете расширение myobjs в COMMAND, что означает «обрабатывать этот список после расширения 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...