c++ - 提升动态链接
问题描述
我知道这个问题之前被问过很多次,总是以相同的答案结束......添加-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 忍者,很可能我做错了什么,但是,我不知道它是什么。
编辑:
- 我已成功尝试在带有 gcc 5 和 boost 1.58 的干净 Ubuntu 16.04 上构建它
- 我尝试使用 gcc7.1 和 boost 1.65 在干净的 18.04 上构建它,但没有成功
- 我尝试使用 gcc 5.5 和自编译 boost 1.58 在干净的 18.04 上构建它,但没有成功
- 我尝试使用 gcc 5.5 和自编译 boost 1.65 在干净的 18.04 上构建它,但未成功
所有尝试都遵循完全相同的程序。
解决方案
此问题的原因不在 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 组件!
推荐阅读
- python - 将 0d 数组转换为 1d numpy 数组
- go - 不能在字段值中使用 1(类型 int)作为类型 *int
- swift - 用多个不同的替换替换多个不同的出现 - Swift4.2
- mysql - 在 CakePHP 3 中进行深度 notMatching() 关联的正确方法是什么
- r - 强制 dbGetQuery 生成字符串
- c# - .NET 是否有 IComparer 的忽略大小写的实现
? - java - 使用 POSTMAN 向所有用户发送 FCM 通知
- c++ - 包含函数指针的类可以用作非类型模板参数吗?
- mysql - 你如何只返回包含 MySQL 中特定值的组?
- swift - 如何快速将参数传递给选择器?