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