Целевой путь кросс-компиляции CMake

Я делаю кросс-компиляцию с помощью CMake.

В моем CMakeLists.txt (используется как для компиляции, так и для кросс-компиляции):

set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
find_package(foo REQUIRED)
add_library(mylib SHARED ${SRCS})
target_link_libraries(mylib ${FOO_LIBRARIES)

В моем toolchain.cmake:

set(CMAKE_CXX_FLAGS "... --sysroot=/path/to/sysroot/ ... ")
set(CMAKE_CXX_LINK_FLAGS "... --sysroot=/path/to/sysroot/ ... )
...
set(CMAKE_FIND_ROOT_PATH /path/to/sysroot)

Учтите, что foo находится в /path/to/sysroot/usr/local/lib/foo.so, когда я выполняю кросс-компиляцию пути среды выполнения для mylib< /em> — это /path/to/sysroot/usr/local/lib

Я хочу, чтобы путь среды выполнения был /usr/local/lib, чтобы отражать мою целевую файловую систему.

Как я могу сделать это, не определяя жестко закодированную переменную CMAKE_INSTALL_RPATH в моем CMakelists.txt?

РЕДАКТИРОВАТЬ: я использовал /usr/local/lib для примера, но foo lib находится в определенной папке, которая не является частью системных каталогов: /path/to/sysroot/usr/local/ поделиться/мой пакет/lib/foo.so


person explo91    schedule 22.05.2015    source источник


Ответы (2)


Ознакомьтесь с вики по обработке CMake RPATH.

По умолчанию CMake компилирует ваш исполняемый файл с RPATH, указывающим на расположение библиотеки хост-системы (/crosssdk/sysroot/usr/lib/), а затем (я полагаю) при установке (т.е. make install) он редактирует RPATH в исполняемом файле, чтобы заменить его соответствующим целевым RPATH ( /usr/lib или там, где он у вас есть). Я думаю, что идея заключается в том, что тогда вы можете вносить изменения в общую библиотеку и выполнять вывод в своей хост-системе без необходимости каждый раз устанавливать как общую библиотеку, так и исполняемый файл. В моем случае мой хост — x86, а цель — ARM, поэтому я говорю CMake установить RPATH сборки так же, как RPATH установки:

set_target_properties(mytarget PROPERTIES BUILD_WITH_INSTALL_RPATH TRUE)
person benf    schedule 12.08.2015
comment
Идея не может быть использована в моем случае, потому что моя библиотека связана с другими библиотеками, расположенными в нестандартном месте. Итак, мне нужно, чтобы rpath был установлен в дополнительное место в дополнение к /usr/local/lib. - person explo91; 17.08.2015
comment
Так как это нестандартное расположение, вам придется указать путь к библиотеке где-то. Установка LD_LIBRARY_PATH в целевой системе может быть одним из решений. - person benf; 17.08.2015

Я не уверен, какую цепочку инструментов кросс-компиляции вы используете.

Вам нужно указать компиляторы C/CXX, компоновщик и т. д. Наряду с этим некоторые из важных переменных — CMAKE_FIND_ROOT_PATH_MODE_LIBRARY и CMAKE_FIND_ROOT_PATH_MODE_INCLUDE. Если вы установите для них значение «ТОЛЬКО», то при вызове FindXXX() поиск будет происходить только в каталоге целевой корневой файловой системы, но не на машине сборки.

В моем случае мне не нужно указывать sysroot, поскольку кросс-компилятор уже знает, что он выполняет кросс-компиляцию, а также знает расположение целевой корневой файловой системы.

С помощью этого файла набора инструментов я просто компилирую исходники без каких-либо дополнительных флагов, загружаю исполняемый файл на цель, и он отлично работает, подбирая файл *.so непосредственно с правильного пути.

Попробуйте с этим и дайте мне знать, как это происходит.

Вот мой файл цепочки инструментов:

set(ELDK_DIR /opt/eldk/ppc-v42-1)


set (CMAKE_C_COMPILER ${ELDK_DIR}/usr/bin/ppc_6xx-gcc)
set (CMAKE_CXX_COMPILER ${ELDK_DIR}/usr/bin/ppc_6xx-g++)
set (CMAKE_LINKER ${ELDK_DIR}/usr/bin/ppc_6xx-ld CACHE STRING "Set the cross-compiler tool LD" FORCE)
set (CMAKE_AR ${ELDK_DIR}/usr/bin/ppc_6xx-ar CACHE STRING "Set the cross-compiler tool AR" FORCE)
set (CMAKE_NM ${ELDK_DIR}/usr/bin/ppc_6xx-nm CACHE STRING "Set the cross-compiler tool NM" FORCE)
set (CMAKE_OBJCOPY ${ELDK_DIR}/usr/bin/ppc_6xx-objcopy CACHE STRING "Set the cross-compiler tool OBJCOPY" FORCE)
set (CMAKE_OBJDUMP ${ELDK_DIR}/usr/bin/ppc_6xx-objdump CACHE STRING "Set the cross-compiler tool OBJDUMP" FORCE)
set (CMAKE_RANLIB ${ELDK_DIR}/usr/bin/ppc_6xx-ranlib CACHE STRING "Set the cross-compiler tool RANLIB" FORCE)
set (CMAKE_STRIP ${ELDK_DIR}/usr/bin/ppc_6xx-strip CACHE STRING "Set the cross-compiler tool RANLIB" FORCE)

# Target environment
set (CMAKE_FIND_ROOT_PATH ${ELDK_DIR}/ppc_6xx)

# Don't search for programs in the host environment
set (CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)

# Search for the libraries and headers in the target environment
set (CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set (CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
person leodotcloud    schedule 22.05.2015
comment
Мой файл набора инструментов определил компиляторы и т. д. Мой фрагмент кода был короче, чем мой файл набора инструментов. Переменные Cmake для управления командами findXXX правильно установлены как ваши. Я за исключением того, что вы не ссылаетесь на общую библиотеку, которая не находится в системных папках по умолчанию вашего sysroot, и именно поэтому ваш rpath установлен правильно, потому что не изменен CMake (ваши rpaths являются системными каталогами) - person explo91; 26.05.2015