1 Вопрос: как удалить «:» из cmake TARGET_OBJECTS и использовать его в пользовательской команде

вопрос создан в Wed, May 8, 2019 12:00 AM

Я хочу использовать 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 р>     

0
1 ответ                              1                         

$<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)
    
0
2019-05-08 16: 09: 23Z
  1. большое спасибо. Я использовал "COMMAND ld -r $< TARGET_OBJECTS: objlib1 > -o lib1.o", но все еще встречал ту же ошибку "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. co -o lib1.o /bin /sh: /home/yongle.xh/tmp/cmake_test/lib/lib1/CMakeFiles/objlib1.dir/lib.co: В доступе отказано "
    2019-05-09 02: 48: 58Z
  2. @ leon Weird. Тем более, что ошибка «Отказано в доступе», похоже, ссылается на правильный файл. Можете ли вы попробовать добавить add_dependencies(mylib1 objlib1) в CMakeList, чтобы исключить проблемы параллелизма?
    2019-05-09 08: 15: 24Z
источник размещен Вот