1 Câu hỏi: Làm thế nào để loại bỏ Lv:

câu hỏi được tạo ra tại Wed, May 8, 2019 12:00 AM

Tôi muốn sử dụng objs trong Ld, nhưng tôi không thể xóa ";" trong objs.

Làm cách nào tôi có thể xóa ";"?

hoặc có bất kỳ phương pháp nào khác để khắc phục nó?

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)

đầu ra

[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 Câu trả lời                              1                         

$<TARGET_OBJECTS:objlib1> là biểu thức của trình tạo (còn gọi là "genex"), có nghĩa là nó chỉ được đánh giá tại tạo thời gian: sau khi CMake đã xử lý tất cả các tệp đầu vào của nó và đã bắt đầu tạo hệ thống xây dựng. Trong khi CMake vẫn đang xử lý đầu vào, đó là một chuỗi bằng chữ. Do đó, string(REPLACE) của bạn không thể có bất kỳ ảnh hưởng nào, bởi vì chuỗi $<TARGET_OBJECTS:objlib1> không chứa bất kỳ dấu chấm phẩy nào.

Tuy nhiên, tôi không nghĩ rằng bạn thực sự cần phải xóa chúng theo bất kỳ cách nào. Điều khiến chúng xuất hiện trên dòng lệnh là do bạn trích dẫn việc mở rộng myobjs trong COMMAND, có nghĩa là "coi danh sách này sau khi mở rộng genex là một đối số duy nhất cho lệnh." Đó rất có thể không phải là những gì bạn muốn. Để truyền các đối tượng dưới dạng một đối số, chỉ cần xóa các dấu ngoặc kép (và cả lệnh string không cần thiết):

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. cảm ơn rất nhiều. Tôi đã sử dụng "Ld -r $< TARGET_OB DỰ ÁN: objlib1 > -o lib1.o", nhưng vẫn gặp lỗi tương tự "cd /home/yongle.xh/tmp/cmake_test/lib/lib1 & /home/yongle.xh/tmp/cmake_test/lib/lib1/CMakeFiles/objlib1.dir/lib1_public.cpp.o;/home/yongle.xh/tmp/cmake_test/lib/lib1/co -o lib1.o /bin /sh: /home/yongle.xh/tmp/cmake_test/lib/lib1/CMakeFiles/objlib1.dir/lib.co: Quyền bị từ chối "
    2019-05-09 02: 48: 58Z
  2. @ leon Weird. Đặc biệt là do lỗi "cho phép bị từ chối" dường như đang tham chiếu đúng tệp. Bạn có thể thử thêm add_dependencies(mylib1 objlib1) vào CMakeList để loại trừ các vấn đề tương tranh không?
    2019-05-09 08: 15: 24Z
nguồn đặt đây