3

序章:

CMakeを使用してクロスプラットフォームのコンパイルスクリプトを取得しようとしています(Windows32のVS 9.0およびUnixのMakefilesの場合)。

add_subdirectory()について理解できない問題が発生しています。

私のコードをお見せしましょう:

コンテクスト:

「module1」という名前のモジュールの私のアーキテクチャは次のようなものです:

  • CMakeLists.txt
  • 含む/
    • file1.h
    • file2.h
    • * .h
  • src /
    • file1.cpp
    • file2.cpp
    • * .cpp
  • テスト/
    • CMakeLists.txt
    • src /
      • testfile1.cpp
      • testfile2.cpp

私のアプリケーション全体のアーキテクチャは、これらのモジュールで構成されています。これらのモジュールは、それ自体が独立して機能するプロジェクトです。

私の目標:

  1. モジュールをライブラリとしてコンパイルしたい

  2. test/フォルダー内のコードでライブラリをテストしたい

これが私が書いたCMakeListsです:

これは、私のモジュールのルートディレクトリにあるCMakeLists.txtです。

#ENSURE MINIMUM VERSION OF CMAKE
cmake_minimum_required(VERSION 2.8)

#CONFIGURATION OF THE PROJECT   
    #NAME OF THE PROJECT    
     project(MyProject)

    #OUTPUT OF THE PROJECT  
    set(LIBRARY_OUTPUT_PATH lib/${CMAKE_BUILD_TYPE}) 

    #ADD THE HEADERS OF THE LIBRARY BEING CREATED   
    include_directories(include)

    #ADD 3rd PARTY OPENCV LIBRARIES     
    find_package(OpenCV REQUIRED)       

    #ADD 3rd PARTY XERCES LIBRARIES
    include_directories(${XERCES_INCLUDE_DIR})
    link_directories(${XERCES_LIB_DIR})     
    set(Xerces_LIBS xerces-c_3D.lib)


#CONFIGURATION OF THE LIBRARY   
file(GLOB_RECURSE MYPROJECT_MODULE_CXX src/*)   
file(GLOB_RECURSE MYPROJECT_MODULE_HDR include/*)       

#NAME OF THE PRESENT LIBRARY    
set(MYPROJECT_MODULE_LIB_NAME myModuleLib)
add_library(${MYPROJECT_MODULE_LIB_NAME}
        SHARED
        ${MYPROJECT_MODULE_CXX}
        ${MYPROJECT_MODULE_HDR}
        )   
target_link_libraries(${MYPROJECT_MODULE_LIB_NAME}
               ${OpenCV_LIBS}
               ${Xerces_LIBS}
               )

#CONTINUE IN THE SUB FOLDERS
add_subdirectory(test)

そして、test /フォルダーに、CMakeLists.txtがあります。

#ENSURE MINIMUM VERSION OF CMAKE
cmake_minimum_required(VERSION 2.8)

#CONFIGURATION OF THE PROJECT
    #NAME OF THE PROJECT
    project(MyProjectTest)

    #OUTPUT OF THE PROJECT
    set(EXECUTABLE_OUTPUT_PATH bin/${CMAKE_BUILD_TYPE})

    #ADD OUR TESTED LIBRARY
    include_directories(../include)
    link_directories(../build/lib/${CMAKE_BUILD_TYPE})


#CONFIGURATION OF THE EXE
    file(GLOB_RECURSE MYPROJECT_MODULE_TEST_CXX src/*)

    #NAME OF THE PRESENT EXECUTABLE
    set(MYPROJECT_MODULE_TEST_BIN_NAME myModuleTest)
    add_executable(${MYPROJECT_MODULE_TEST_BIN_NAME}
               ${MYPROJECT_MODULE_TEST_CXX}
               )
    target_link_libraries(${MYPROJECT_MODULE_TEST_BIN_NAME}
                  ${MYPROJECT_MODULE_LIB_NAME}
                  )

質問

CMakeは、正しいMyProject.sln Visual Studio 9.0ソリューションを出力します。これは、OpenCVおよびXerces(およびその他のサードパーティライブラリ)にリンクされたライブラリで正常にコンパイルされます。ただし、テストバイナリはMyProjectTest.slnを出力しませんでした。

私は、add_subdirectory(dir)が次のサブディレクトリでCMakeを実行するために使用されたと思いました(つまり、名前を明確にすることはできませんでした:p!)。 test /ディレクトリを作成し、MyProjectTest.slnソリューションを作成しますか?

GUI CMakeを使用して、モジュールのルートに作成したビルドディレクトリでルートCMakeLists.txtを実行します。テスト/フォルダーであるMyProjet.slnを見つけることができるビルドディレクトリを探索すると、MyProjectTest.slnが含まれていません。

4

2 に答える 2

3

これは元の問題を解決しない可能性がありますが、test/folder/CMakeLists.txt変更してみてください

#ADD OUR TESTED LIBRARY
include_directories(../include)
link_directories(../build/lib/${CMAKE_BUILD_TYPE})

#ADD OUR TESTED LIBRARY
include_directories(${CMAKE_SOURCE_DIR}/include)
link_directories(${CMAKE_BINARY_DIR}/lib/${CMAKE_BUILD_TYPE})

それ以外の場合は、ビルドフォルダーの名前が常にであると想定していますbuild

于 2011-07-20T13:38:08.840 に答える
1

3日間すべてを試した後、私はついに答えを見つけました... DLRdave卿は実際に正しかった:問題はコード自体からではなく、「コード外」の何かからでした。

見つかった問題:

Notepad++を使用してすべてのファイルを作成および編集しました。実際、Windowsのメモ帳でファイルを開くと(興味があったので)、奇妙な長方形の記号が表示され、ファイルはNotepad++で通常表示されるものとは異なりました。この記号はNotepad++の「\n\r」であることがわかりました。表示されません(フィルタリングする必要があります)が、Windowsのメモ帳を見ると、ファイル全体が「不純」であり、メモ帳++で見たレイアウトではなく1行で表示されていることがわかります。

この「エンコーディング」バグはサブディレクトリCMakeListsにのみ発生したため、読み取ることはできませんでしたが、CMakeで解釈するとエラーは発生しませんでした。そのため、CMakeの実行でエラーが返されませんでした。

解決:

Javaのnative2ascii.exeツールを使用して、エンコードエラーを修正しました。

理由:

実際には、CMakeの構文パーサーは、奇妙なエンコーディングで表示されるこのタイプの文字をフィルタリングするように設計されていない可能性があります。そのため、3日間の集中的なデバッグが行われました。

于 2011-07-20T14:16:47.153 に答える