2015-05-22 8 views
1

Я использую кросс-компиляцию с использованием CMake.CMake cross compile target rpath

В моей 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 расположен в /путь/to/sysroot/usr/local/lib/foo.so, когда я перекрестно скомпилирую путь выполнения для mylib is /path/to/sysroot/usr/local/lib

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

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

EDIT: Я использовал/USR/местные/Библиотека для примера, но Foo Lib расположены в определенной папке, которая не является частью системы директорий:/путь/к/SYSROOT/USR/местные/доли /mypackage/lib/foo.so

ответ

1

Заканчивать вики на CMake RPATH handling.

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

set_target_properties(mytarget PROPERTIES BUILD_WITH_INSTALL_RPATH TRUE) 
+0

Идея не может быть используется в моем случае, потому что моя библиотека связана с другими библиотеками, расположенными в нестандартном местоположении. Итак, мне нужно, чтобы rpath был настроен на дополнительное место в дополнение к/usr/local/lib. – explo91

+1

Поскольку это нестандартное местоположение, вам нужно будет установить путь к библиотеке * где-то *. Установка LD_LIBRARY_PATH в целевой системе может быть одним из решений. – benf

+0

Я думаю, что вы правы! – explo91

0

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

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

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

С помощью этого файла toolchain я просто скомпилирую источники без каких-либо дополнительных флагов, загружаю исполняемый файл в целевую систему и отлично запускаю файл * .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) 
+0

Моего файл набор инструментов определяются Teh компиляторов и т.д. ...Мой фрагмент кода был короче, чем мой файл toolchain. Переменные Cmake для управления командами findXXX правильно установлены как ваши. Я за исключением того, что вы не ссылаетесь на общую lib, которая не находится в системных папках по умолчанию вашего sysroot, и поэтому ваш rpath правильно установлен, потому что не изменен CMake (ваши rpaths являются системными dirs) – explo91