2

CMake を使用する 2 つのプロジェクトがあります。

1 つ目は共有ライブラリです。正常にコンパイルおよびインストールされます。現在、「デバッグ」リリースをビルドする必要があります。ということで、現在は の下にインストールされてい~/localdebugます。そのフォルダーは、「include」および「lib」ディレクトリーを持つファイルシステムのルートのように見えます。「/usr/local」と同じ概念。

2つ目はプログラムです。で私のライブラリに対してコンパイルおよびリンクする必要があります~/localdebug。そのCMakeLists.txtためのファイルは次のようになります。

cmake_minimum_required(VERSION 2.6)
set(CMAKE_C_FLAGS "-std=gnu99")

#add_definitions(-pg)
find_library(SANDGROUSE_LIB NAMES sandgrouse)
add_library(http_parser http_parser.c)
add_executable(rsva11001adapter main.c rsva11001.c)

target_link_libraries(rsva11001adapter http_parser ${SANDGROUSE_LIB})

次のコマンドを実行して、make ファイルをセットアップします。

cmake --debug-output -DCMAKE_BUILD_TYPE=Debug -DCMAKE_PREFIX_PATH="/home/ericu/localdebug" ..

CMake wiki に基づいて、設定DCMAKE_PREFIX_PATHはまさに私が望むことを行います。

CMAKE_PREFIX_PATH

(CMake 2.6.0 以降) これは、FIND_PACKAGE()、FIND_PATH()、FIND_PROGRAM()、または FIND_LIBRARY() コマンドを使用してインクルード ファイル、バイナリ、またはライブラリを検索するときに使用されます。CMAKE_PREFIX_PATH リストの各パスについて、CMake は、FIND_PATH() が呼び出されたときに「PATH/include」と「PATH」をチェックし、FIND_PROGRAM() が呼び出されたときに「PATH/bin」と「PATH」をチェックし、「PATH/lib」と「PATH/lib」をチェックします。 FIND_LIBRARY() が呼び出されたときの「PATH」。詳細については、FIND_PACKAGE()、FIND_LIBRARY()、FIND_PATH()、および FIND_PROGRAM() のドキュメントを参照してください。

ただし、「make VERBOSE=1」を実行すると、次のようになります。

cd /home/ericu/rsva11001adapter/build/src && /usr/bin/gcc -std=gnu99 -g -o CMakeFiles/rsva11001adapter.dir/main.co -c /home/ericu/rsva11001adapter/src/main.c
/ home/ericu/rsva11001adapter/src/main.c:19:31: 致命的なエラー: sandgrouse/server.h: そのようなファイルまたはディレクトリ
のコンパイルは終了しませんでした。

そのため、CMake が で何かを見つけているようには見えませんCMAKE_PREFIX_PATH。明らか-Iに、コンパイラの呼び出しにも変数を追加していません。

CMakeCache.txt を調べると、変数が何であるかがわからないように見えます。

// No help, variable specified on the command line.
CMAKE_PREFIX_PATH:UNINITIALIZED=/home/ericu/localdebug

私はこれに1時間以上取り組んできました。非標準ライブラリを使用するのがこれほど難しい場合は、CMake の使用をあきらめるところです。

4

1 に答える 1

4

ライブラリをコンパイルするときに -I フラグを追加するように CMake に指示する必要があります。

find_path(SANDGROUSE_INCLUDE_DIR sandgrouse/server.h)
include_directories(${SANDGROUSE_INCLUDE_DIR}

add_library()呼び出しの前にこれらの行を配置します。

于 2013-03-09T09:35:51.573 に答える