7

cmake クロスコンパイラ プロジェクトで奇妙な問題が発生しています。

自分のライブラリは見つかりましたが、ツールチェーンの (システム) ライブラリは見つかりませんでした。

以前は、debian スクイーズ マシンで KDevelop を使用していました。現在、debian wheezy を搭載した新しいマシンで構成に失敗しています。mやのようなシステム ライブラリは見つかりませんpthread

私の古いマシンでは、以下は完全に機能していましたが、これを機能させるために何か特別なことをしたことを覚えていません。

ここに私のCMakeLists.txtファイルの1つがあります

cmake_minimum_required(VERSION 2.8)
SET(CMAKE_SYSTEM_NAME Linux)
SET(CMAKE_SYSTEM_VERSION 2.6.36.4)
SET(CMAKE_C_COMPILER arm-angstrom-linux-gnueabi-gcc)
SET(CMAKE_CXX_COMPILER arm-angstrom-linux-gnueabi-g++)
include_directories(../include
  ../../../sample/include)

project(testmain)

add_executable(testmain
   some_c-source-file.c)

set(CMAKE_LIBRARY_PATH ../lib/arm-26/lib
  ../../../sample/lib/arm-26/lib)
find_library(LIBS_TEST NAMES akku)
find_library(LIBS_M NAMES m)
find_library(LIBS_PTHREAD NAMES pthread )
target_link_libraries(akkumain
  ${LIBS_TEST}
  ${LIBS_M}
  ${LIBS_PTHREAD})

set(CMAKE_C_FLAGS "-Wall -Werror")
set(CMAKE_C_FLAGS_DEBUG "-g3 -O2 -rdynamic")
set(CMAKE_C_FLAGS_RELEASE "-g0 -O0")
set(CMAKE_CXX_FLAGS "-Wall -Werror")
set(CMAKE_CXX_FLAGS_DEBUG "-g3 -O2 -rdynamic")
set(CMAKE_CXX_FLAGS_RELEASE "-g0 -O0")

これは、KDevelop を使用してコンパイルしようとしたときに表示されるメッセージです: (繰り返しますが、これは私の古いマシンで動作していました)

/home/user/testmain/build> /usr/bin/cmake -DCMAKE_BUILD_TYPE=Debug /home/user/testmain/
-- The C compiler identification is GNU 4.3.3
-- The CXX compiler identification is GNU 4.3.3
-- Check for working C compiler: /usr/local/angstrom/arm/bin/arm-angstrom-linux-gnueabi-gcc
-- Check for working C compiler: /usr/local/angstrom/arm/bin/arm-angstrom-linux-gnueabi-gcc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler: /usr/local/angstrom/arm/bin/arm-angstrom-linux-gnueabi-g++
-- Check for working CXX compiler: /usr/local/angstrom/arm/bin/arm-angstrom-linux-gnueabi-g++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done

CMake Error: The following variables are used in this project, but they are set to NOTFOUND.
Please set them or make sure they are set and tested correctly in the CMake files:
LIBS_M
    linked by target "akkumain" in directory /home/user/testmain
LIBS_PTHREAD
    linked by target "akkumain" in directory /home/user/testmain

したがって、LIBS_TEST が見つかります。しかし、そうではありませlibmlibpthread。さまざまなプロジェクトでこれを試しました。すべてのライブラリが見つかりましたが、「システム」ライブラリは見つかりませんでした。

私はすでに次のようなさまざまなことを試しました

set(CMAKE_FIND_LIBRARY_PREFIXES lib )
set(CMAKE_FIND_LIBRARY_SUFFIXES .a )

そして、覚えていないことがいくつかあります。

ディレクトリを手動で指定したときに機能する唯一のことは次のとおりです。

find_library(ASTLIBS_M NAMES m PATHS /usr/local/angstrom/arm/arm-angstrom-linux-gnueabi/usr/lib)

これを指定した後CMakeLists.txt、ライブラリが見つかり、エラーなしでプロジェクトをコンパイルできます。

しかし、これは私が望んでいるものではありません。なぜなら、私にはたくさんのプロジェクトと多くのライブラリがあり、すべてを編集したくないからですCMakeLists.txt... :(

IDE/CMake ファイル内で特別なことを何も指定せずに、私の古いマシンがシステム ライブラリを見つけた理由を知っている人はいますか?

編集: 実行ファイルの 1 つで、Linker ステージで glibc からいくつかのシンボルが見つからないというエラーがスローされることに気付きました - 私の debian wheezy システムにはもっと問題があるようです。- 私はそれを理解できるといいのですが...

編集:

簡単に要約すると、私のコードはうまくコンパイルされますが、ツールチェーンのすべてのライブラリが見つかりません。ツールチェーンのライブラリへのパスを手動で追加すると、コンパイルはできますが、リンカー ステージで失敗します。

4

2 に答える 2

18

ツールチェーン ファイルを使用したことがありますか? また、ARM と AVR に多くのクロスコンパイルを行っていますが、問題なく非常にうまく動作します (KDevelop も使用しており、CMake と一緒に美しく動作します) 主なポイントは、 CMAKE_FIND_ROOT_PATH変数を使用してツールチェーン ルート ファイルシステムへのパスを指定することです。これらすべてをファイルに入れてみてください。通常、クロスコンパイルするアーキテクチャにちなんで名前を付けます(この場合はarm-unknown-linux-gnueabi.cmake と呼びます):

# the name of the target operating system
SET(CMAKE_SYSTEM_NAME Linux)

# which C and C++ compiler to use
SET(CMAKE_C_COMPILER   arm-unknown-linux-gnueabi-gcc)
SET(CMAKE_CXX_COMPILER arm-unknown-linux-gnueabi-g++) 

# here is the target environment located
SET(CMAKE_FIND_ROOT_PATH  /home/claudio/TS-7400/rootfs) 

# adjust the default behaviour of the FIND_XXX() commands:
# search headers and libraries in the target environment, search 
# programs in the host environment
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY BOTH)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE BOTH)

変数CMAKE_FIND_ROOT_PATH_MODE_xxxCMake変数は、バイナリ、ライブラリ、およびヘッダー ファイルを検索する場所を制御することに注意してください。私は通常、PROGRAM を に設定NEVERして、クロスアーキテクチャ ルート ファイルシステムのバイナリを使用しないようにしています。ライブラリとヘッダー ファイルBOTHの場合、指定された ROOT_PATH を最初に検索し、見つからない場合はホスト マシンのシステム ディレクトリを通過することを意味します。

そうすれば、プロジェクトをクロスコンパイルするときはいつでも、ビルド ディレクトリを作成し (ビルド中に作成されたファイルとソースが混在しないようにするため)、必要なツールチェーン ファイルを指定してそこからcmakeCMakeLists.txtを実行するだけです。使用するには(ソースが配置されているのと同じディレクトリにあるツールチェーンファイルと一緒にあると仮定しています-私の例ではproject_sources_dir):

cd project_sources_dir
mkdir build
cd build
cmake -DCMAKE_TOOLCHAIN_FILE=../arm-unknown-linux-gnueabi.cmake ..

ツールチェーン ファイルを使用することの要点は、ホスト マシン用にまったく同じプロジェクトをコンパイルする場合、CMakeLists.txt. ツールチェーン ファイルを指定せずにcmakeを実行するだけです。

cd project_sources_dir
mkdir build
cd build
cmake ..

プロジェクトは、代わりにホスト マシン用にネイティブにコンパイルする準備ができています。それだけでは不十分な場合は、 CMake Cross Compilingで詳細を確認できます。

于 2014-01-08T21:10:43.663 に答える