3

ブースト ライブラリをクロス コンパイルされた C++ プログラムにリンクする際に問題があります。私が書いたコードは、arm-target (Pandaboard、同じく Ubuntu 12.04) の Ubuntu 12.04 で CodeSourcery とクロスコンパイルされています。ライブラリなしの単純なテスト プログラムのコンパイルは問題なく動作し、静的ライブラリを使用した OpenCV でも問題なく動作します。

ただし、boost 1.52.0 ライブラリをリンクする際の問題は次のとおりです。

ブースト ライブラリをリンクしてクロスコンパイルすると (-lboost_thread -lboost_system)、プログラムはエラーなしでコンパイルされますが、ターゲットで実行すると何も起こりません。

あたかも実行されなかったかのように、プログラムはエラーなしで終了します。

ブースト ライブラリをリンクせずに CodeSourcery でクロスコンパイルすると、ターゲット上ですべて正常に動作します。g++ でローカルにコンパイル: すべて問題ありません。

テスト目的で、コードを次の数行に減らしました:(クロノ関数が使用されていない場合でもエラーが表示されます。リンクするだけで違いが生じます)

main.cpp

#include <iostream>
using namespace std;

#include<boost/chrono.hpp>

int main(int argc, char* argv[]) {

    cout << "!!!this test worked!!!" << endl;

    return 0;
}

リンカー コマンドは (Eclipse から):

arm-none-linux-gnueabi-g++ -L/home/xy/arm-none-linux-gnueabi/lib -o "testARM" ./src/main.o -lpthread -lboost_thread -lboost_system

ブースト ライブラリは、このガイドに従って CodeSourcery arm-none-linux-gnueabi-g++ でクロスコンパイルされました。それらをすべてターゲットの /usr/lib フォルダーにコピーし、/usr/lib を PATH と LD_LIBRARY_PATH に追加しました。

私はEclipseでリモートデバッグを試みましたが、それは同じです: プログラムを開始..プログラムは1で終了しました.しかし、何も起こりませんでした.

エラーを出力したり、何かが欠けていると文句を言ったりすることさえありません。だから今のところ、私が試したことのないグーグルでできることはこれ以上考えられません...

これを修正するためのヒントを教えてください。

よろしくお願いします!


アップデート:

テスト プログラムを strace で実行すると、ログに次の情報が含まれます。

    $ vi strace-testARM.log
    22:23:56.511385 execve("./testARM", ["./testARM"], [/* 17 変数 */]) = 0
    22:23:56.512789 brk(0) = 0xfae000
    22:23:56.512972 uname ({sys="Linux", node="パンダ", ...}) = 0
    22:23:56.514010 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (そのようなファイルまたはディレクトリはありません)
    22:23:56.514315 mmap2 (NULL、8192、PROT_READ|PROT_WRITE、MAP_PRIVATE|MAP_ANONYMOUS、-1、0) = 0xb6f9b000
    22:23:56.514498 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (そのようなファイルまたはディレクトリはありません)
    22:23:56.514742 オープン ("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
    22:23:56.514986 fstat64(3, {st_mode=S_IFREG|0644, st_size=52288, ...}) = 0
    22:23:56.515353 mmap2 (NULL、52288、PROT_READ、MAP_PRIVATE、3、0) = 0xb6f72000
    22:23:56.515536​​ 閉じる (3) = 0
    22:23:56.515688 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (そのようなファイルまたはディレクトリはありません)
    22:23:56.515902 オープン ("/lib/arm-linux-gnueabihf/libpthread.so.0", O_RDONLY|O_CLOEXEC) = 3
    22:23:56.516207 read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\3\0(\0\1\0\0\ 0\5P\0\0004\0\0\0"..., 512) = 512
    22:23:56.516451 lseek (3、66332、SEEK_SET) = 66332
    22:23:56.516573 read(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \0\0\0\0\0\0\0\0\0\0\0\0"..., 1400) = 1400
    22:23:56.516787 lseek (3、65924、SEEK_SET) = 65924
    22:23:56.516909 read(3, "A6\0\0\0aeabi\0\1,\0\0\0\0057-A\0\6\n\7A\10\1\t\2\n \4\22"..., 55) = 55
    22:23:56.517153 fstat64(3, {st_mode=S_IFREG|0755, st_size=100802, ...}) = 0
    22:23:56.517519 mmap2 (NULL、107024、PROT_READ|PROT_EXEC、MAP_PRIVATE|MAP_DENYWRITE、3、0) = 0xb6f57000
    22:23:56.517642 mprotect (0xb6f67000、28672、PROT_NONE) = 0
    22:23:56.517794 mmap2 (0xb6f6e000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0xf) = 0xb6f6e000
    22:23:56.517977 mmap2 (0xb6f70000, 4624, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb6f70000
    22:23:56.518160 閉じる (3) = 0
    22:23:56.518313 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (そのようなファイルまたはディレクトリはありません)
    22:23:56.518557 open("/lib/arm-linux-gnueabihf/tls/v7l/neon/vfp/libboost_thread.so.1.52.0", O_RDONLY|O_CLOEXEC) = -1 ENOENT (そのようなファイルまたはディレクトリはありません)
    22:23:56.518832 stat64("/lib/arm-linux-gnueabihf/tls/v7l/neon/vfp", 0xbea34ea8) = -1 ENOENT (そのようなファイルまたはディレクトリはありません)
    22:23:56.519076 open("/lib/arm-linux-gnueabihf/tls/v7l/neon/libboost_thread.so.1.52.0", O_RDONLY|O_CLOEXEC) = -1 ENOENT (そのようなファイルはありません)
... [ファイルが見つからない他の多くのディレクトリ] ...
    22:23:56.545382 stat64("/usr/lib/neon/vfp", 0xbea34ea8) = -1 ENOENT (そのようなファイルまたはディレクトリはありません)
    22:23:56.545565 open("/usr/lib/neon/libboost_thread.so.1.52.0", O_RDONLY|O_CLOEXEC) = -1 ENOENT (そのようなファイルまたはディレクトリはありません)
    22:23:56.545748 stat64("/usr/lib/neon", 0xbea34ea8) = -1 ENOENT (そのようなファイルまたはディレクトリはありません)
    22:23:56.545932 open("/usr/lib/vfp/libboost_thread.so.1.52.0", O_RDONLY|O_CLOEXEC) = -1 ENOENT (そのようなファイルまたはディレクトリはありません)
    22:23:56.546115 stat64("/usr/lib/vfp", 0xbea34ea8) = -1 ENOENT (そのようなファイルまたはディレクトリはありません)
    22:23:56.546298 オープン ("/usr/lib/libboost_thread.so.1.52.0", O_RDONLY|O_CLOEXEC) = 3
    22:23:56.546481 read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\3\0(\0\1\0\0\ 0\324\331\0\0004\0\0\0"..., 512) = 512
    22:23:56.546755 lseek (3、121020、SEEK_SET) = 121020
    22:23:56.546878 read(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \0\0\0\0\0\0\0\0\0\0\0\0"..., 1200) = 1200
    22:23:56.547091 lseek (3、119052、SEEK_SET) = 119052
    22:23:56.547213 read(3, "A(\0\0\0aeabi\0\1\36\0\0\0\0055TE\0\6\4\10\1\t\1\22\4 \24\1\25"..., 41) = 41
    22:23:56.547396 exit_group(1) = ?


更新 2:

Ubuntu ホストでプログラムをコンパイルし、ファイルを Pandaboard に転送し、@ShaunMarko の提案に従って次のコマンドを発行します。

`ldd testARM` =>  `not a dynamic executable`

`file testARM` => `testARM: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.16, not stripped`

`file libboost_thread.so.1.52.0` => `libboost_thread.so.1.52.0: ELF 32-bit LSB shared object, ARM, version 1 (SYSV), dynamically linked, not stripped`

-v -H私が受け取ったコンパイル中のg ++​​式に追加する:

... /xy/CodeSourcery/bin/../lib/gcc/arm-none-linux-gnueabi/4.7.2/../../../../arm-none-linux-gnueabi/include/boost/utility/result_of.hpp

COLLECT_GCC_OPTIONS='-O0' '-g3' '-Wall' '-c' '-fmessage-length=0' '-v' '-H' '-MMD' '-MP' '-MF' 'main.d' '-MT' 'main.d' '-o' 'main.o' '-shared-libgcc' '-march=armv5te' '-mtls-dialect=gnu' '-funwind-tables' '-D' '__CS_SOURCERYGXX_MAJ__=2012' '-D' '__CS_SOURCERYGXX_MIN__=9' '-D' '__CS_SOURCERYGXX_REV__=64'
 /xy/CodeSourcery/bin/../lib/gcc/arm-none-linux-gnueabi/4.7.2/../../../../arm-none-linux-gnueabi/bin/as -v -march=armv5te -meabi=5 -o main.o /tmp/cceTwLmn.s
GNU assembler version 2.23.51 (arm-none-linux-gnueabi) using BFD version (Sourcery CodeBench Lite 2012.09-64) 2.23.51.20120829
COMPILER_PATH=/xy/CodeSourcery/bin/../libexec/gcc/arm-none-linux-gnueabi/4.7.2/:/xy/CodeSourcery/bin/../libexec/gcc/:/xy/CodeSourcery/bin/../lib/gcc/arm-none-linux-gnueabi/4.7.2/../../../../arm-none-linux-gnueabi/bin/
LIBRARY_PATH=/xy/CodeSourcery/bin/../lib/gcc/arm-none-linux-gnueabi/4.7.2/:/xy/CodeSourcery/bin/../lib/gcc/:/xy/CodeSourcery/bin/../lib/gcc/arm-none-linux-gnueabi/4.7.2/../../../../arm-none-linux-gnueabi/lib/:/xy/CodeSourcery/bin/../arm-none-linux-gnueabi/libc/lib/:/xy/CodeSourcery/bin/../arm-none-linux-gnueabi/libc/usr/lib/
COLLECT_GCC_OPTIONS='-O0' '-g3' '-Wall' '-c' '-fmessage-length=0' '-v' '-H' '-MMD' '-MP' '-MF' 'main.d' '-MT' 'main.d' '-o' 'main.o' '-shared-libgcc' '-march=armv5te' '-mtls-dialect=gnu' '-funwind-tables' '-D' '__CS_SOURCERYGXX_MAJ__=2012' '-D' '__CS_SOURCERYGXX_MIN__=9' '-D' '__CS_SOURCERYGXX_REV__=64'

**** Build Finished ****

(これは最後の部分です。その上に、大量の含まれているヘッダーがリストされています。xy-Path は、ホーム ディレクトリに CodeSourcery がインストールされている場所です)

4

1 に答える 1

3

ARMアプリケーションを構築するための一般的なルール(実際、どのプラットフォームにも当てはまる必要があります)

プログラム全体を同じABIでコンパイルし、互換性のあるライブラリのセットとリンクする必要があります。

あなたの場合、最後のアイテムは次のよう/usr/lib/libboost_thread.so.1.52.0になります。これは使用法にも関連しているため、libboost_threadクロスコンパイルしているホスト上のアイテムと一致していることを確認してください。

22:23:56.546298 open("/usr/lib/libboost_thread.so.1.52.0", O_RDONLY|O_CLOEXEC) = 3
22:23:56.546481 read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0(\0\1\0\0\0\324\331\0\0004\0\0\0"..., 512) = 512
22:23:56.546755 lseek(3, 121020, SEEK_SET) = 121020
22:23:56.546878 read(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 1200) = 1200
22:23:56.547091 lseek(3, 119052, SEEK_SET) = 119052
22:23:56.547213 read(3, "A(\0\0\0aeabi\0\1\36\0\0\0\0055TE\0\6\4\10\1\t\1\22\4\24\1\25"..., 41) = 41
22:23:56.547396 exit_group(1)           = ?

システムでは、さまざまなABIやVFP / NEONサポートなど、ライブラリのさまざまなバリエーションを使用ARMできます。既成のツールチェーンを入手すると、ARM用であるという理由だけで、デフォルトでターゲットと一致しない場合があります。

アップデート

以前のログを確認する場合

22:23:56.515902 open("/lib/arm-linux-gnueabihf/libpthread.so.0", O_RDONLY|O_CLOEXEC) = 3
22:23:56.516207 read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0(\0\1\0\0\0\5P\0\0004\0\0\0"..., 512) = 512
22:23:56.516451 lseek(3, 66332, SEEK_SET) = 66332
22:23:56.516573 read(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 1400) = 1400
22:23:56.516787 lseek(3, 65924, SEEK_SET) = 65924
22:23:56.516909 read(3, "A6\0\0\0aeabi\0\1,\0\0\0\0057-A\0\6\n\7A\10\1\t\2\n\4\22"..., 55) = 55

2つのことがわかります。最初に、システムはhfパスからのものです。読み取られたデータには、libboost_threadライブラリのARMv5TEを意味する7-Aのに対し、おそらくARMv7-Aを意味するも表示されます。5TEファイルユーティリティではなく、ツールチェーンのreadelfを使用してelfファイルに関する情報を取得する必要があります。

Boostをコンパイルして-march=armv7-a -mfpu=vfpv3-d16 -mfloat-abi=hard、結果のバイナリを `/ usr / lib/vfpの下に配置しようとします。

Debianサイトからvfpのものを読むことはあなたに大いに役立つと思います、そしてあなたは状況を理解するためにブーストのコンパイルプロセスを扱う代わりにあなた自身で小さな練習をするべきです。

于 2013-01-24T09:40:21.170 に答える