【问题标题】:Error linking boost libraries链接 boost 库时出错
【发布时间】:2012-06-28 01:49:21
【问题描述】:

我想运行需要 boost 库的代码。我使用 CMake 构建了它。其他人已经编写了此代码和 cmakelist。它需要与 boost regex、文件系统和系统库链接。

我下载了 boost 1.48 并构建了上面提到的 3 个库。现在我有 dll 和静态库(.a)。我运行了一个使用这些库的简单程序。效果很好。

现在在使用 CMake 时,它​​会给出与 boost 库相关的链接器错误。我检查了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 构建它。从 boost 网站下载 boost 1.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 ()

【问题讨论】:

  • 什么是 VOSM ? Google 告诉我 VOSM:兽医骨科和运动医学组 ...
  • 我在 linux.use 的 linux 代码上工作过。在代码中,有测试文件夹。错误是哪个程序文件 essembletraining.cpp 文件位于 /vosm-0.3.3/tests/test_ensembletraining 中。目标文件位于 /vosm-0.3.3/tests/test_ensembletraining/CMakeFiles .
  • 请检查 /vosm-0.3.3/tests/CMAKEFILEs/ 中的 cmakelst 和 /vosm-0.3.3/tests/CMAKEFILEs/test_essemmbletraining 中的 link.txt

标签: boost linker cmake


【解决方案1】:

我建议使用find_package 来查找所需的 Boost 库:

  • BOOST_ROOT 环境变量设置为Boost 根目录,即包含boostlibsstage 和其余部分的那个,例如C:\boost_1_48_0(全局或执行 CMake 时)
  • 将以下内容添加到您的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_RUNTIME 设置为 TRUE

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-18
    • 1970-01-01
    • 2015-11-23
    • 1970-01-01
    • 1970-01-01
    • 2012-05-03
    • 1970-01-01
    相关资源
    最近更新 更多