Видимость halide_library в подкаталоге с использованием системы сборки CMake - PullRequest
1 голос
/ 12 марта 2020

Кажется, что библиотека Halide, созданная с помощью:

halide_library(xxx SRCS xxx_generator.cpp)

в CMakeLists.txt в подкаталоге, невидима для своих родительских или параллельных каталогов.

Например, у меня есть проект Halide, использующий CMake, например:

├── A
│   ├── a_generator.cpp
│   ├── a_run_generator.cpp
│   └── CMakeLists.txt
├── B
│   ├── b_run_generator.cpp
│   └── CMakeLists.txt
└── CMakeLists.txt

И в CMakeLists.txt в подпапке A у меня есть

halide_library(a_filter SRCS a_generator.cpp)

И я хочу связать библиотеку "a_filter" с "b_run_generator. cpp" в подпапке B следующим образом:

add_executable(b_run_generator b_run_generator.cpp)
target_link_library(b_run_generator PRIVATE a_filter)

CMake жалуется, что не может найти "a_filter".

И если я ссылаюсь на явный путь к «a_filter», появляется много ошибок, например:

/usr/bin/ld: ../genfiles/a/a.a(a.a.o): in function `a':
halide_buffer_t.cpp:(.text.a+0x82f): undefined reference to `halide_error_buffer_argument_is_null'
/usr/bin/ld: halide_buffer_t.cpp:(.text.a+0x8a3): undefined reference to `halide_error_buffer_allocation_too_large'
/usr/bin/ld: halide_buffer_t.cpp:(.text.a+0x8be): undefined reference to `halide_error_buffer_allocation_too_large'
/usr/bin/ld: halide_buffer_t.cpp:(.text.a+0x8d6): undefined reference to `halide_error_buffer_extents_too_large'
/usr/bin/ld: halide_buffer_t.cpp:(.text.a+0x8f1): undefined reference to `halide_error_buffer_allocation_too_large'
/usr/bin/ld: halide_buffer_t.cpp:(.text.a+0x90c): undefined reference to `halide_error_buffer_allocation_too_large'
/usr/bin/ld: halide_buffer_t.cpp:(.text.a+0x927): undefined reference to `halide_error_buffer_extents_too_large'
/usr/bin/ld: halide_buffer_t.cpp:(.text.a+0x943): undefined reference to `halide_error_device_dirty_with_no_device_support'
/usr/bin/ld: halide_buffer_t.cpp:(.text.a+0x95f): undefined reference to `halide_error_host_is_null'
/usr/bin/ld: halide_buffer_t.cpp:(.text.a+0x986): undefined reference to `halide_error_bad_type'
/usr/bin/ld: halide_buffer_t.cpp:(.text.a+0x9a2): undefined reference to `halide_error_bad_dimensions'
/usr/bin/ld: halide_buffer_t.cpp:(.text.a+0x9cc): undefined reference to `halide_error_access_out_of_bounds'
/usr/bin/ld: halide_buffer_t.cpp:(.text.a+0x9e4): undefined reference to `halide_error_buffer_extents_negative'
/usr/bin/ld: halide_buffer_t.cpp:(.text.a+0xa0e): undefined reference to `halide_error_access_out_of_bounds'
/usr/bin/ld: halide_buffer_t.cpp:(.text.a+0xa2b): undefined reference to `halide_error_buffer_extents_negative'
/usr/bin/ld: halide_buffer_t.cpp:(.text.a+0xa45): undefined reference to `halide_error_buffer_extents_negative'
/usr/bin/ld: halide_buffer_t.cpp:(.text.a+0xa5f): undefined reference to `halide_error_buffer_extents_negative'
/usr/bin/ld: halide_buffer_t.cpp:(.text.a+0xa99): undefined reference to `halide_error_constraint_violated'
clang-9: error: linker command failed with exit code 1 (use -v to see invocation)

Итак, мой вопрос: как мне создать библиотеку галогенидов? в подкаталоге, видимом для его родительских или параллельных каталогов?

1 Ответ

3 голосов
/ 12 марта 2020

Функция halide_library на самом деле создает библиотеку IMPORTED, которая по умолчанию отображается только в текущей области или ниже:

# Inside 'halide_library_from_generator' function which is called from 'halide_library'
# ...
add_library("${BASENAME}" STATIC IMPORTED)

В то время как обычные add_library(IMPORTED) принимает GLOBAL ключевое слово для того, чтобы сделать его глобально видимым, halide_library не принимает это ключевое слово.

Вы можете "обернуть" цель, созданную с помощью halide_library, чтобы полученная цель была видна глобально:

halide_library(a_filter SRCS a_generator.cpp)
# Create globally visible wrapper target 'a_filter_global'.
add_library(a_filter_global INTERFACE)
target_link_libraries(a_filter_global INTERFACE a_filter)

Затем используйте цель-обертку:

add_executable(b_run_generator b_run_generator.cpp)
target_link_library(b_run_generator PRIVATE a_filter_global)

Начиная с версии 3.11, CMake позволяет установить свойство IMPORTED_GLOBAL для цели IMPORTED, чтобы сделать ее видимой в глобальном масштабе:

halide_library(a_filter SRCS a_generator.cpp)
# Make the target globally visible.
set_target_properties(a_filter PROPERTIES IMPORTED_GLOBAL TRUE)

Обратите внимание, что установка свойства должна выполняться из того же каталога, в котором создается цель с halide_library.

...