首页 > 解决方案 > 提升动态链接

问题描述

我知道这个问题之前被问过很多次,总是以相同的答案结束......添加-DBOOST_LOG_DYN_LINK到您的CMakeLists.txt文件中。

但是,我已经在我的 cmake 中使用了很长时间,并且所有内容都可以毫无问题地链接。现在我决定从 16.04 切换到 Ubuntu 18.04,并一一更新我的项目......

这是我的 cmake 文件:

cmake_minimum_required(VERSION 2.8.4)
project(FOO)

find_package(Boost REQUIRED COMPONENTS system timer filesystem log program_options unit_test_framework)
find_package(CGAL COMPONENTS Core)
find_library(OPEN_MESH_CORE_LIBRARY OpenMeshCore /usr/local/lib/OpenMesh REQUIRED)
find_library(YAML_CPP_LIBRARY yaml-cpp  REQUIRED)

set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules/")

find_package(PkgConfig REQUIRED)
pkg_check_modules(JSONCPP jsoncpp)
link_libraries(${JSONCPP_LIBRARIES})
include_directories(${JSONCPP_INCLUDE_DIRS})

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ffast-math -fopenmp -msse2 -march=native -W -Wall -std=c++11")
add_definitions(-DBOOST_LOG_DYN_LINK=1)
add_definitions(-DUNIT_TEST_DATA="${CMAKE_SOURCE_DIR}/data")

include( ${CGAL_USE_FILE} )
include( CGAL_CreateSingleSourceCGALProgram )

set(SOURCE_FILES 
        Foo1.cpp
        Foo2.cpp
        Foo3.cpp)

add_executable(FOO main.cpp ${SOURCE_FILES})
target_include_directories(FOO PRIVATE ${JsonCpp_INCLUDE_DIRS})
target_link_libraries(FOO ${OPEN_MESH_CORE_LIBRARY} ${Boost_LIBRARIES} ${YAML_CPP_LIBRARY} ${JSONCPP_LIBRARIES})

add_library(foo SHARED ${SOURCE_FILES})
target_link_libraries(foo ${OPEN_MESH_CORE_LIBRARY} ${Boost_LIBRARIES} ${YAML_CPP_LIBRARY} ${JSONCPP_LIBRARIES})

add_executable(tests test.cpp ${SOURCE_FILES})
target_include_directories(FOO PRIVATE ${JsonCpp_INCLUDE_DIRS})
target_link_libraries(tests ${OPEN_MESH_CORE_LIBRARY} ${Boost_LIBRARIES} ${YAML_CPP_LIBRARY} ${JSONCPP_LIBRARIES})

编译时,它会因已知的一长串问题而失败,所有相关的问题都以一条消息结尾

undefined reference to boost::log::v2_mt_posix::...

我不是 cmake 忍者,很可能我做错了什么,但是,我不知道它是什么。

编辑:

所有尝试都遵循完全相同的程序。

标签: c++boostcmakeboost-log

解决方案


此问题的原因不在 Boost 或 CMakeLists.txt 中。这实际上是 CGAL 在调用find_package(Boost)时在其使用协议的某个地方再次include( ${CGAL_USE_FILE} )调用的问题,并最终Boost_LIBRARIES用指向它自己的组件的链接覆盖,完全忽略了我之前发现的内容。这是报告的问题

解决方案有点脏,因为我没有修补 CGAL。只需在我打电话时更改订单include( ${CGAL_USE_FILE} )并将其放在顶部即可。

find_package(CGAL COMPONENTS Core)
include( ${CGAL_USE_FILE} )
find_package(Boost REQUIRED COMPONENTS system timer filesystem log 
program_options unit_test_framework)

注意,这是一个快速修复,可能会导致更多问题,例如覆盖 CGAL 所需的 Boost 组件!


推荐阅读