1 सवाल: cmake TARGET_OBJECTS के ":" को कैसे निकालें, और कस्टम कमांड में इसका उपयोग करें

पर बनाया गया सवाल Wed, May 8, 2019 12:00 AM

मैं COMMAND ld में objs का उपयोग करना चाहता हूं, लेकिन मैं हटा नहीं सकता ";" in 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

    
0
1 उत्तर                              1                         

$<TARGET_OBJECTS:objlib1> एक जनरेटर अभिव्यक्ति (उर्फ "जीनक्स") है, जिसका अर्थ है कि यह केवल उत्पन्न समय पर मूल्यांकन करता है: के बाद सीएमके ने अपनी सभी इनपुट फ़ाइलों को संसाधित किया है और बिल्ड सिस्टम को बनाना शुरू कर दिया है। जबकि सीएमके अभी भी इनपुट प्रोसेस कर रहा है, यह एक शाब्दिक स्ट्रिंग है। आपके string(REPLACE) पर इसलिए कोई प्रभाव नहीं पड़ सकता, क्योंकि स्ट्रिंग 0600350991100100135035062 में कोई अर्ध-कॉलन नहीं है।

हालाँकि, मुझे नहीं लगता कि आपको वास्तव में उन्हें किसी भी तरह से हटाने की आवश्यकता है। उन्हें कमांड लाइन पर दिखाई देने का क्या कारण है, यह तथ्य है कि आप $<TARGET_OBJECTS:objlib1> में 0600350991100101035062 के विस्तार का हवाला दे रहे हैं, जिसका अर्थ है "कमांड के लिए एकल तर्क के रूप में जीनक्स विस्तार के बाद इस सूची का इलाज करें।" यह सबसे अधिक संभावना है कि आप क्या चाहते हैं। ऑब्जेक्ट्स को एक तर्क के रूप में पास करने के लिए, बस उद्धरणों को हटा दें (और अनावश्यक रूप से myobjs कमांड भी):

COMMAND     
0
2019-05-08 16: 09: 23Z
  1. बहुत बहुत धन्यवाद। मैंने "COMMAND ld -r $< TARGET_OBJECTS: objll11 > -o lib1.o" का उपयोग किया है, लेकिन अभी भी एक ही त्रुटि "cd /home/yongle.xh/tmp/cmake_test/lib1/lib1 & ld -rd से मिली है। /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 अजीब। खासकर जब से "अनुमति से इनकार" त्रुटि सही फ़ाइल को संदर्भित करती है। क्या आप समसामयिक मुद्दों से निपटने के लिए CMakeList को string जोड़ने का प्रयास कर सकते हैं?
    2019-05-09 08: 15: 24Z
    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)
    
स्रोत रखा गया यहाँ