Увеличить динамическое связывание - PullRequest
0 голосов
/ 15 декабря 2018

Я знаю, что этот вопрос задавался много раз прежде, всегда заканчиваясь тем же ответом ... добавьте -DBOOST_LOG_DYN_LINK к вашему CMakeLists.txt файлу.

Однако, у меня было это в моем cmakeдавно и все связывалось без проблем.Теперь я решил переключиться на Ubuntu 18.04 с 16.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, и очень вероятно, что я делаю что-то не так, однако я не могу выяснить, что это такое.

РЕДАКТИРОВАТЬ:

  • У меня успешно попытался собрать его на чистой Ubuntu 16.04 с gcc 5 и boost 1.58
  • У меня безуспешно пытался собрать его на чистом 18.04 с gcc7.1 и boost 1.65
  • У меня безуспешно пытался скомпилировать его на чистом 18.04 с gcc5.5 и само скомпилированный буст 1.58
  • У меня безуспешно пытался собрать его на чистом 18.04 с gcc 5.5 и само скомпилированным бустом 1.65

Все попытки последовали заточно такая же процедура.

1 Ответ

0 голосов
/ 18 декабря 2018

Причины этой проблемы не было в 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)

Пожалуйста, ПРИМЕЧАНИЕ , что это быстрое решение и может привести к дальнейшим проблемам, таким каккак переопределяющие компоненты Boost, требуемые CGAL!

...