0

私は CMake の初心者で、Qt4 を使用して画像操作を行う単純な静的ライブラリを作成しようとしました。

cmake_minimum_required(VERSION 2.8)
project(timage)

find_package(Qt4 REQUIRED)
include(${QT_USE_FILE})
add_definitions(${QT_DEFINITIONS})

include_directories(
    "${PROJECT_SOURCE_DIR}/include"
)
add_library(
    timage
    ${PROJECT_SOURCE_DIR}/source/timage.cpp
)
target_link_libraries(
    timage
    ${QT_LIBRARIES}
)

私はそれを構成して生成することができ、それは正常にビルドすることさえできますlibtimage.a。今、私はそれを私のメインプロジェクトに含めたいと思っています.ここで問題が始まります.

いくつかの単体テストから始めましたが、すでにリンカー エラーが発生しています (クラスundefined referenceの関数呼び出しごとに)。TImage単体テストを作成しましたg++ -Wall -Wextra -std=c++11 -I../include -L../bin -ltimage -o test spec.cpp

個人的には、Qt4 の作業以外に初心者向けのチュートリアルに対して行っていることとの違いはわかりません。誰かがここで正しい方向へのヒントを教えていただければ幸いです。

更新 この CMake ファイルを使用してテストをビルドすると、次のことがわかりました。

link_directories(
    ${PROJECT_BINARY_DIR}
)
add_definitions("-std=c++11")
add_executable(
    test
    spec.cpp
)
target_link_libraries(
    test
    timage
)

すべてが期待どおりに機能します。私は現在、CMakeがしていないことを見つけようとしています。

4

1 に答える 1

2

あなたの問題は、 libtimage.a がおそらく にない../binことですが、デフォルトでは${PROJECT_BINARY_DIR}ビルドディレクトリにあります。

g++ コマンドでは../bin、ライブラリの検索パスに追加していますが、どこにでも追加する必要があります${PROJECT_BINARY_DIR}

これは、コマンドの 2 番目の CMakeLists ファイルで実現されますlink_directories。ただし、一般的には、このコマンドを使用しない方がよいでしょう (ドキュメントで理由が説明されています)。

timageテストの CMakeLists.txt で CMake ターゲットとして使用できる場合は、使用する必要はありません。CMake は、ビルドされたライブラリの場所を既に認識しており、適切なフラグを自動的link_directoriesに渡します。-L「CMake ターゲット」とは、コマンドを使用してそのファイルまたは親 CMakeLists.txt で定義されていることを意味しますadd_library

テスト CMakeLists.txt で実際の CMake ターゲットでない場合timage(つまり、共通の親 CMakeLists.txt から呼び出されない完全に別のプロジェクトである場合)、いくつかのオプションがあります。

を使用してテスト プロジェクトがプロジェクトをインポートできるようにプロジェクトを作成exportするか、ライブラリを個別にビルドしてから、 を使用してテストでプロジェクトを検索することができます。これにより、libtimage.a が見つかった場合、そのフル パスが得られます。timageincludefind_library

これらのオプションはすべて、 を使用する必要を回避しますlink_directories

もう 1 つのポイントは、CMake が呼び出しているビルド コマンドを正確に確認できることです。

make VERBOSE=1

そのため、テストをビルドするときに、CMake で生成されたコマンドを独自のコマンドと比較できます。

于 2012-08-29T22:10:55.397 に答える