0

Boostライブラリが必要なコードを実行したい。CMakeを使って作成しました。他の誰かがこのコードとcmakelistを書いています。Boost正規表現、ファイルシステム、およびシステムライブラリとリンクする必要があります。

Boost 1.48をダウンロードし、上記の3つのライブラリをビルドしました。これで、dllと静的ライブラリ(.a)ができました。これらのライブラリを使用した簡単なプログラムを実行しました。それはうまくいきました。

CMakeを使用しているときに、ブーストライブラリに関連するリンカーエラーが発生します。cmakelistを確認しましたが、何を変更すればよいかわかりません。cmakelistの関連部分は次のとおりです。

set(WITH_BOOST_REGEX ON CACHE BOOL "Include BOOST REGEX support")
set(WITH_BOOST_FILESYSTEM ON CACHE BOOL "Include BOOST FILESYSTEM support")
set(WITH_BOOST_SYSTEM ON CACHE BOOL "Include BOOST SYSTEM support")

if(WITH_BOOST_REGEX)
  CHECK_MODULE(libboost-regex HAVE_BOOST_REGEX)
else()
  set(HAVE_BOOST_REGEX FALSE)
endif()

if(WITH_BOOST_FILESYSTEM)
  CHECK_MODULE(libboost-filesystem HAVE_BOOST_FILESYSTEM)
else()
  set(HAVE_BOOST_FILESYSTEM FALSE)
endif()

リンク先の指定を間違えただけだと思いますが、修正方法がわかりません。

そのプログラムとライブラリのオブジェクトファイルのパスを正常に指定することにより、boost_regexの動的ライブラリと静的ライブラリの両方にリンクする簡単なサンプルプログラムを正常に実行しています。

このコードには、他にもさまざまなモジュールがあります。boost_regexライブラリが欠落していると表示されます。link.txtは、リンクするライブラリを示し、次のようになっています。

/usr/bin/c++ CMakeFiles/test_ensembletraining.dir/ensembletraining.o -o ../../bin/test_ensembletraining -rdynamic ../../lib/libensembletraining.so.0.3.2 ../../lib/libutils.so.0.3.2 ../../lib/libfeatureextraction.so.0.3.2 ../../lib/libintegraltransform.so.0.3.2 -lboost_regex.so -lboost_filesystem -lboost_system.so -lopencv_core -lopencv_flann -lopencv_imgproc -lopencv_highgui -lopencv_ml -lopencv_video -lopencv_objdetect -lopencv_features2d -lopencv_calib3d -lopencv_legacy -lopencv_contrib -Wl,-rpath,/home/rizwan/vosm-0.3.3/lib:

opencvライブラリとは正常にリンクしますが、boostライブラリとはリンクしません。リンクライブラリのパスを指定するのは間違いだと思います。すべてのcmakelistファイルを調べて、このパスが指定されている場所を見つけようとしました。

誰かが助けたいのなら、最初にVOSMからコードをダウンロードしてください。CMakeを使用してビルドします。BoostWebサイトからBoost1.48ライブラリをダウンロードします。それが機能している場合は、その方法を教えてください。

これはcmakecachelistの一部です:

//Include BOOST FILESYSTEM support
WITH_BOOST_FILESYSTEM:BOOL=ON

//Include BOOST REGEX support
WITH_BOOST_REGEX:BOOL=ON

//Include BOOST SYSTEM support
WITH_BOOST_SYSTEM:BOOL=ON

//Include OPENCV 2.x support
WITH_OPENCV:BOOL=ON

これがcmakelistです。

if (BUILD_EXAMPLES)
    project(ensembletraining_exe)

    if(CMAKE_COMPILER_IS_GNUCXX)
        set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-function")
    endif()

    include_directories(
        "${CMAKE_SOURCE_DIR}/modules/ensembletraining/include"
        "${CMAKE_SOURCE_DIR}/modules/common/include"
        "${CMAKE_SOURCE_DIR}/modules/featureextraction/include"
    )

    # ---------------------------------------------
    #      Define executable targets
    # ---------------------------------------------
    MACRO(VO_DEFINE_EXAMPLE name srcs)
        set(the_target "test_${name}")
        add_executable(${the_target} ${srcs})
        set_target_properties(${the_target} PROPERTIES
            OUTPUT_NAME "test_${name}"
            PROJECT_LABEL "(EXAMPLE) test_${name}")
        add_dependencies(${the_target} ensembletraining 
            opencv_core opencv_flann opencv_imgproc opencv_highgui
            opencv_ml opencv_video opencv_objdetect opencv_features2d
            opencv_calib3d opencv_legacy opencv_contrib)
        target_link_libraries(${the_target} ${VOSM_LINKER_LIBS} ensembletraining utils featureextraction integraltransform
            boost_regex boost_filesystem boost_system opencv_core
            opencv_flann opencv_imgproc opencv_highgui opencv_ml opencv_video opencv_objdetect
            opencv_features2d opencv_calib3d opencv_legacy opencv_contrib)

        if(WIN32)
            install(TARGETS ${the_target}
                RUNTIME DESTINATION "tests" COMPONENT main)
        endif()
        install(TARGETS ${the_target} RUNTIME DESTINATION bin COMPONENT main)
    ENDMACRO(VO_DEFINE_EXAMPLE)

    file(GLOB cpp_samples RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.cpp *.c)

    foreach(sample_filename ${cpp_samples})
        get_filename_component(sample ${sample_filename} NAME_WE)
        VO_DEFINE_EXAMPLE(${sample}  ${sample_filename})
    endforeach()
endif(BUILD_EXAMPLES)

if (INSTALL_C_EXAMPLES AND NOT WIN32)
    file(GLOB C_SAMPLES *.c *.cpp *.jpg *.png *.data makefile.* build_all.sh *.dsp *.cmd )
    install(FILES ${C_SAMPLES}
            DESTINATION share/vosm/tests
            PERMISSIONS OWNER_READ GROUP_READ WORLD_READ)
endif ()
4

1 に答える 1

0

find_package必要なBoostライブラリを見つけるために使用することをお勧めします。

  • 環境変数をBoostルートディレクトリに設定BOOST_ROOTします。つまり、、、および残りを含むディレクトリにboost設定します。たとえば、libs(グローバルに、またはCMakeの実行時に)stageC:\boost_1_48_0
  • 以下をあなたのに追加してくださいCMakeLists.txt

    find_package(Boost 1.48 COMPONENTS regex system filesystem REQUIRED)
    target_link_libraries(your_target ${Boost_LIBRARIES})
    include_directories(${Boost_INCLUDE_DIRS})
    
  • 静的ライブラリのみが必要な場合は、Boost_USE_STATIC_LIBS変数をTRUE(find_packageの前に!)に設定します。

  • Boostが静的C++ランタイムに対してリンクされている場合は、をに設定しますBoost_USE_STATIC_RUNTIMETRUE
于 2012-07-01T14:07:35.847 に答える