我想在COMMAND ld中使用objs,但是我不能删除“;”在objs中。
如何删除“;”?
或还有其他解决方法?
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 :(得分:0)
$<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)
答案 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)