2016-04-30 2 views
0

К сожалению, я приостановил перенос программного обеспечения моего под OpenWRT из-за проблемы с привязкой, но для того, чтобы глубже проникнуть в вышеупомянутую проблему, мне нужно кратко дать вам некоторые сведения о моем программном обеспечении ,Перекрестный компилятор CMake/Linker для OpenWRT

Он состоит из трех модулей: LIB-1, LIB-2 и APP.

Я разрабатываю его под LUbuntu с Netbeans/C++ и CMake. Я скрещиваю компиляцию с помощью CMake (я успешно выполнил это руководство http://www.vtk.org/Wiki/CMake_Cross_Com … chain_file), и я построил toolchain и целевое изображение Generic-x86 OpenWRT с помощью последнего официального инструмента BUILDROOT (он работает под VirtualBox, как шарм).

Я установил CMAKE_LIBRARY_OUTPUT_DIRECTORY и CMAKE_RUNTIME_OUTPUT_DIRECTORY в общую папку ($ {CMAKE_BINARY_DIR}/bin), чтобы все двоичные файлы были включены в одну и ту же папку.

Теперь, я создаю проект для LUbuntu и внутри папки ouput, я нахожу LIB-1.so, LIB-2.so и APP, как и ожидалось. Затем я запускаю 'ldd' на APP, и я вижу, что он ссылается на LIB-1.so и LIB-2.so, как и ожидалось. В результате подробного вывода CMake я также вижу, что CMake устанавливает (как и ожидалось) RPATH, который указывает на '$ {CMAKE_BINARY_DIR}/bin'.

Теперь вдаваться в подробности выпуска ...

Я строю проект для OpenWRT и внутри выходной папки я найти все три файла, как и ожидалось. Затем я выполняю 'ldd' и 'objdump -x', и я вижу, что APP-ссылки на '../bin/LIB-1.so' и '../bin/LIB-2.so' (имя файла плюс относительный префикс пути !!!). Другое отличие состоит в том, что CMake (я не знаю, почему) не добавляет RPATH в командной строке соединения!

Чтобы получить APP, связанную с двумя библиотеками без относительного пути «../bin», я должен поместить два файла SO внутри папки связывания APP и вручную запустить компоновщик, лишив «../ bin/'и добавление' -Wl, -rpath, $ {CMAKE_BINARY_DIR}/bin '.

Может кто-нибудь объяснить мне:

1) Почему CMake связывает две платформы, используя различные параметры командной строки?

2) Как я могу связать с CMake avoind встраивание относительного пути SO?

3) Если ни один из читателей не использует CMake, может ли кто-нибудь сказать мне, существует ли дополнительный параметр для компоновщика G ++ для переноса относительных путей из ссылочных LIB?

спасибо!

ответ

0

на данный момент я нашел обходное решение.

создать Баш скрипт вроде этого (OpenWRT-FIX-ЛИЭС):

#!/bin/bash 

TARGET_NAME=$1 
OUTPUT_DIR=$2 

# Prologue 

ECHO_PREFIX=[----] 
echo "$ECHO_PREFIX Fixing OpenWRT library imports for \"$TARGET_NAME\"..." 

# Dependencies copy 

echo "$ECHO_PREFIX Copying libraries locally from \"$OUTPUT_DIR\"..."; 
cp $OUTPUT_DIR/*.so . 

if [ $? != 0 ]; then 
    exit 1 
fi 

# Link command hacking 

LINK_COMMAND=./CMakeFiles/$TARGET_NAME.dir/link.txt 
echo "$ECHO_PREFIX Hacking link command at \"$LINK_COMMAND\"..." 

LINK_COMMAND=$(cat $LINK_COMMAND | sed -e 's/\.\.\/bin\///g') 
#echo "$ECHO_PREFIX <$LINK_COMMAND>" 

if [ $? != 0 ]; then 
    exit 1 
fi 

# Re-linking 

echo "$ECHO_PREFIX Re-linking..."; 

$LINK_COMMAND 

if [ $? != 0 ]; then 
    exit 1 
fi 

# Update rebuilt binary 

echo "$ECHO_PREFIX Updating \"$TARGET_NAME\" binary..." 
cp *$TARGET_NAME* ${OUTPUT_DIR} 

if [ $? != 0 ]; then 
    exit 1 
fi 

# Epilogue 

echo "$ECHO_PREFIX Libraries imports successfully fixed." 

Затем я добавил в CMakeLists.TXT файл любого модуля мне нужна эта пользовательская команда:

if (_PLATFORM STREQUAL "OPENWRT") 

    add_custom_command(
    TARGET    ${_TARGET_NAME} 
    POST_BUILD COMMAND ${_GLOBAL_SCRIPTS_DIR}/openwrt-fix-libs ${_TARGET_NAME} ${_GLOBAL_OUTPUT_DIR} 
) 

endif (_PLATFORM STREQUAL "OPENWRT") 

Где _PLATFORM является набор символов мною в командной строке при компиляции для OpenWRT, _GLOBAL_SCRIPTS_DIR моей папка проекта скриптов и _GLOBAL_OUTPUT_DIR затем bin внутри корня здания CMake.

Надеюсь, это может быть полезно и вам.