适当提高CMake的使用在Ubuntu上没有链接 [英] Boost not Linking properly using CMake on Ubuntu

查看:659
本文介绍了适当提高CMake的使用在Ubuntu上没有链接的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图使code尽可能的简单,我仍然得到

 未定义的参考`提振::登录:: v2_mt_posix ::。 。 。等等

这是快把我逼疯了,所以我张贴我的code:

的CMakeLists.txt

  cmake_minimum_required(3.1版)
项目(BoostTest)集(CMAKE_CXX_FLAGS$ {} CMAKE_CXX_FLAGS -std = C ++ 11 -pthread -DBOOST_LOG_DYN_LINK)设置(SOURCE_FILES
    Logger.cpp
    Logger.h
    loggertest.cpp)集(BOOST_ROOT在/ usr /本地)find_package(升压1.57.0组件将线程系统所需)include_directories($ {} Boost_INCLUDE_DIRS)add_executable(BoostTest $ {} SOURCE_FILES)target_link_libraries(BoostTest $ {} Boost_LIBRARIES)

loggertest.cpp

 的#includeLogger.h使用命名空间idair;INT主(INT ARGC,CHAR *的argv []){
    记录仪记录;
    log.trivialLogging();
    返回0;
}

Logger.h

 的#ifndef ONEPRINT_LOGGER_H
#定义ONEPRINT_LOGGER_H#包括LT&;升压/日志/核心/ core.hpp>
#包括LT&;升压/日志/属性/ attribute_value_set.hpp>
#包括LT&;升压/日志/ trivial.hpp>
#包括LT&;升压/日志/来源/ severity_logger.hpp>
#包括LT&;升压/日志/工具/设置/ file.hpp>
#包括LT&;升压/日志/工具/设置/ console.hpp>
#包括LT&;升压/日志/工具/设置/ common_attributes.hpp>
#包括LT&;升压/日志/ sinks.hpp>
#包括LT&;升压/核心/ null_deleter.hpp>空间日志=提振::登录;
命名空间EXPR =提振::登录::前pressions;
命名空间来源=的boost ::登录::来源;
命名空间=下沉的boost ::登录::汇;
命名空间关键字=提振::登录::关键词;命名空间idair {    枚举severity_level
    {
        正常,
        警告,
        错误,
        危急
    };    类记录器{
    上市:
        无效trivialLogging();    };}
#ENDIF // ONEPRINT_LOGGER_H

Logger.cpp

 的#includeLogger.h使用命名空间idair;无效记录仪:: trivialLogging(){
    BOOST_LOG_TRIVIAL(跟踪)LT;< 一个跟踪严重性消息;
    BOOST_LOG_TRIVIAL(调试)LT;< 调试严重性消息;
    BOOST_LOG_TRIVIAL(信息)LT;< 信息性严重性消息;
    BOOST_LOG_TRIVIAL(警告)LT;< 警告严重性消息;
    BOOST_LOG_TRIVIAL(错误)LT;< 一个严重的错误消息;
    BOOST_LOG_TRIVIAL(致命)LT;< 致命的严重消息;
}

错误

 目标BoostTest扫描依赖
[50%]大厦CXX对象CMakeFiles / BoostTest.dir / Logger.cpp.o
[100%]建筑CXX对象CMakeFiles / BoostTest.dir / loggertest.cpp.o
链接CXX可执行BoostTest
CMakeFiles / BoostTest.dir / Logger.cpp.o:在功能`idair ::记录仪:: trivialLogging():
/home/pdl/ClionProjects/BoostTest/Logger.cpp:16:未定义的引用`的boost ::登录:: v2_mt_posix ::琐碎::记录::得到()
/home/pdl/ClionProjects/BoostTest/Logger.cpp:16:未定义的引用`的boost ::登录:: v2_mt_posix ::琐碎::记录::得到()
/home/pdl/ClionProjects/BoostTest/Logger.cpp:17:未定义的引用`的boost ::登录:: v2_mt_posix ::琐碎::记录::得到()
/home/pdl/ClionProjects/BoostTest/Logger.cpp:17:未定义的引用`的boost ::登录:: v2_mt_posix ::琐碎::记录::得到()
/home/pdl/ClionProjects/BoostTest/Logger.cpp:18:未定义的引用`的boost ::登录:: v2_mt_posix ::琐碎::记录::得到()
CMakeFiles / BoostTest.dir / Logger.cpp.o:/home/pdl/ClionProjects/BoostTest/Logger.cpp:18:为`更未定义的引用的boost ::登录:: v2_mt_posix ::琐碎::记录::得到() ' 跟随
CMakeFiles / BoostTest.dir / Logger.cpp.o:在函数'的boost ::登录:: v2_mt_posix ::记录::复位():
/usr/local/include/boost/log/core/record.hpp:153:未定义参考`boost::log::v2_mt_posix::record_view::public_data::destroy(boost::log::v2_mt_posix::record_view::public_data常量*)'
CMakeFiles / BoostTest.dir / Logger.cpp.o:在函数'的boost ::登录:: v2_mt_posix ::纪录的boost ::登录:: v2_mt_posix ::来源:: basic_composite_logger&LT;焦炭, boost::log::v2_mt_posix::sources::severity_logger_mt<boost::log::v2_mt_posix::trivial::severity_level>, boost::log::v2_mt_posix::sources::multi_thread_model<boost::log::v2_mt_posix::aux::light_rw_mutex>, boost::log::v2_mt_posix::sources::features<boost::log::v2_mt_posix::sources::severity<boost::log::v2_mt_posix::trivial::severity_level> &GT; >::open_record<boost::parameter::aux::tagged_argument<boost::log::v2_mt_posix::keywords::tag::severity,提高::登录:: v2_mt_posix ::琐碎:: severity_level常量&GT; &GT;(升压::参数:: AUX :: tagged_argument&LT;提高::登录:: v2_mt_posix ::关键词:标签::严重性,提振::登录:: v2_mt_posix ::琐碎:: severity_level常量&GT;常量和放大器;) :
/usr/local/include/boost/log/sources/basic_logger.hpp:456:未定义的引用`提振::登录:: v2_mt_posix ::核心:: get_logging_enabled()const的
CMakeFiles / BoostTest.dir / Logger.cpp.o:在功能`boost::log::v2_mt_posix::aux::record_pump<boost::log::v2_mt_posix::sources::severity_logger_mt<boost::log::v2_mt_posix::trivial::severity_level> &GT; ::〜record_pump():
/usr/local/include/boost/log/sources/record_ostream.hpp:278:未定义的引用`的boost ::登录:: v2_mt_posix :: AUX :: unhandled_exception_count()
CMakeFiles / BoostTest.dir / Logger.cpp.o:在功能`boost::log::v2_mt_posix::aux::record_pump<boost::log::v2_mt_posix::sources::severity_logger_mt<boost::log::v2_mt_posix::trivial::severity_level> >::record_pump(boost::log::v2_mt_posix::sources::severity_logger_mt<boost::log::v2_mt_posix::trivial::severity_level>&,提高::登录:: v2_mt_posix ::记录和放大器;):
/usr/local/include/boost/log/sources/record_ostream.hpp:258:未定义参考`boost::log::v2_mt_posix::aux::stream_provider<char>::allocate_compound(boost::log::v2_mt_posix::record&)'
/usr/local/include/boost/log/sources/record_ostream.hpp:259:未定义的引用`的boost ::登录:: v2_mt_posix :: AUX :: unhandled_exception_count()
CMakeFiles / BoostTest.dir / Logger.cpp.o:在功能`boost::log::v2_mt_posix::aux::record_pump<boost::log::v2_mt_posix::sources::severity_logger_mt<boost::log::v2_mt_posix::trivial::severity_level> &GT; :: auto_release ::〜auto_release():
/usr/local/include/boost/log/sources/record_ostream.hpp:243:未定义参考`boost::log::v2_mt_posix::aux::stream_provider<char>::release_compound(boost::log::v2_mt_posix::aux::stream_provider<char>::stream_compound*)'
CMakeFiles / BoostTest.dir / Logger.cpp.o:在功能`boost::log::v2_mt_posix::sources::aux::severity_level<boost::log::v2_mt_posix::trivial::severity_level>::set_value(boost::log::v2_mt_posix::trivial::severity_level)':
/usr/local/include/boost/log/sources/severity_feature.hpp:135:未定义的引用`提振::登录:: v2_mt_posix ::来源:: AUX :: get_severity_level()
CMakeFiles / BoostTest.dir / Logger.cpp.o:在函数'的boost ::登录:: v2_mt_posix ::纪录的boost ::登录:: v2_mt_posix ::来源:: basic_logger&LT;焦炭, boost::log::v2_mt_posix::sources::severity_logger_mt<boost::log::v2_mt_posix::trivial::severity_level>, boost::log::v2_mt_posix::sources::multi_thread_model<boost::log::v2_mt_posix::aux::light_rw_mutex> >::open_record_unlocked<boost::parameter::aux::tagged_argument<boost::log::v2_mt_posix::keywords::tag::severity,提高::登录:: v2_mt_posix ::琐碎:: severity_level常量&GT; &GT;(升压::参数:: AUX :: tagged_argument&LT;提高::登录:: v2_mt_posix ::关键词:标签::严重性,提振::登录:: v2_mt_posix ::琐碎:: severity_level常量&GT;常量和放大器;) :
/usr/local/include/boost/log/sources/basic_logger.hpp:259:未定义的引用`提振::登录:: v2_mt_posix ::核心:: open_record(升压::登录:: v2_mt_posix :: attribute_set常量和放大器;)
CMakeFiles / BoostTest.dir / Logger.cpp.o:在函数'的boost ::登录:: v2_mt_posix ::核心:: push_record(升压::登录:: v2_mt_posix ::记录和放大器;&安培;):
/usr/local/include/boost/log/core/core.hpp:308:未定义的引用`提振::登录:: v2_mt_posix ::核心:: push_record_move(的boost ::登录:: v2_mt_posix ::记录和放大器;)
collect2:错误:LD返回1退出状态
使[3]:*** [BoostTest]错误1
使[2]:*** [CMakeFiles / BoostTest.dir /全部]错误2
使[1]:*** [CMakeFiles / BoostTest.dir /规则]错误2
使:*** [BoostTest]错误2


解决方案

看起来你安装升压的静态版本。

的boost ::登录:: v2_mt_posix 命名空间在提升动态内置版本中实现(见的此链接)。您的应用程序将尝试对符号从这个命名空间链接,如果你在编译过程中定义BOOST_LOG_DYN_LINK宏。

如果您已经安装Boost.Log的静态建立的版本到/ usr / local,即尝试删除 -DBOOST_LOG_DYN_LINK $ {CMAKE_CXX_FLAGS } 行,重新生成build目录并尝试再次构建。 (旁注:通常你会增加编译器定义的 add_definitions()命令,看的此链接

或者重新安装升压的动态版本。

I've tried to make the code as simple as possible and I'm still getting

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

This is driving me crazy, so I'm posting my code:

CMakeLists.txt

cmake_minimum_required(VERSION 3.1)
project(BoostTest)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -pthread -DBOOST_LOG_DYN_LINK")

set(SOURCE_FILES
    Logger.cpp
    Logger.h
    loggertest.cpp)

set(BOOST_ROOT /usr/local)

find_package(Boost 1.57.0 COMPONENTS log thread system REQUIRED)

include_directories(${Boost_INCLUDE_DIRS})

add_executable(BoostTest ${SOURCE_FILES})

target_link_libraries(BoostTest ${Boost_LIBRARIES})

loggertest.cpp

#include "Logger.h"

using namespace idair;

int main(int argc, char* argv[]) {
    Logger log;
    log.trivialLogging();
    return 0;
}

Logger.h

#ifndef ONEPRINT_LOGGER_H
#define ONEPRINT_LOGGER_H

#include <boost/log/core/core.hpp>
#include <boost/log/attributes/attribute_value_set.hpp>
#include <boost/log/trivial.hpp>
#include <boost/log/sources/severity_logger.hpp>
#include <boost/log/utility/setup/file.hpp>
#include <boost/log/utility/setup/console.hpp>
#include <boost/log/utility/setup/common_attributes.hpp>
#include <boost/log/sinks.hpp>
#include <boost/core/null_deleter.hpp>

namespace logging = boost::log;
namespace expr = boost::log::expressions;
namespace sources = boost::log::sources;
namespace sinks = boost::log::sinks;
namespace keywords = boost::log::keywords;

namespace idair {

    enum severity_level
    {
        normal,
        warning,
        error,
        critical
    };

    class Logger {
    public:
        void trivialLogging();

    };

}
#endif //ONEPRINT_LOGGER_H

Logger.cpp

#include "Logger.h"

using namespace idair;

void Logger::trivialLogging() {
    BOOST_LOG_TRIVIAL(trace) << "A trace severity message";
    BOOST_LOG_TRIVIAL(debug) << "A debug severity message";
    BOOST_LOG_TRIVIAL(info) << "An informational severity message";
    BOOST_LOG_TRIVIAL(warning) << "A warning severity message";
    BOOST_LOG_TRIVIAL(error) << "An error severity message";
    BOOST_LOG_TRIVIAL(fatal) << "A fatal severity message";
}

ERRORS

Scanning dependencies of target BoostTest
[ 50%] Building CXX object CMakeFiles/BoostTest.dir/Logger.cpp.o
[100%] Building CXX object CMakeFiles/BoostTest.dir/loggertest.cpp.o
Linking CXX executable BoostTest
CMakeFiles/BoostTest.dir/Logger.cpp.o: In function `idair::Logger::trivialLogging()':
/home/pdl/ClionProjects/BoostTest/Logger.cpp:16: undefined reference to `boost::log::v2_mt_posix::trivial::logger::get()'
/home/pdl/ClionProjects/BoostTest/Logger.cpp:16: undefined reference to `boost::log::v2_mt_posix::trivial::logger::get()'
/home/pdl/ClionProjects/BoostTest/Logger.cpp:17: undefined reference to `boost::log::v2_mt_posix::trivial::logger::get()'
/home/pdl/ClionProjects/BoostTest/Logger.cpp:17: undefined reference to `boost::log::v2_mt_posix::trivial::logger::get()'
/home/pdl/ClionProjects/BoostTest/Logger.cpp:18: undefined reference to `boost::log::v2_mt_posix::trivial::logger::get()'
CMakeFiles/BoostTest.dir/Logger.cpp.o:/home/pdl/ClionProjects/BoostTest/Logger.cpp:18: more undefined references to `boost::log::v2_mt_posix::trivial::logger::get()' follow
CMakeFiles/BoostTest.dir/Logger.cpp.o: In function `boost::log::v2_mt_posix::record::reset()':
/usr/local/include/boost/log/core/record.hpp:153: undefined reference to `boost::log::v2_mt_posix::record_view::public_data::destroy(boost::log::v2_mt_posix::record_view::public_data const*)'
CMakeFiles/BoostTest.dir/Logger.cpp.o: In function `boost::log::v2_mt_posix::record boost::log::v2_mt_posix::sources::basic_composite_logger<char, boost::log::v2_mt_posix::sources::severity_logger_mt<boost::log::v2_mt_posix::trivial::severity_level>, boost::log::v2_mt_posix::sources::multi_thread_model<boost::log::v2_mt_posix::aux::light_rw_mutex>, boost::log::v2_mt_posix::sources::features<boost::log::v2_mt_posix::sources::severity<boost::log::v2_mt_posix::trivial::severity_level> > >::open_record<boost::parameter::aux::tagged_argument<boost::log::v2_mt_posix::keywords::tag::severity, boost::log::v2_mt_posix::trivial::severity_level const> >(boost::parameter::aux::tagged_argument<boost::log::v2_mt_posix::keywords::tag::severity, boost::log::v2_mt_posix::trivial::severity_level const> const&)':
/usr/local/include/boost/log/sources/basic_logger.hpp:456: undefined reference to `boost::log::v2_mt_posix::core::get_logging_enabled() const'
CMakeFiles/BoostTest.dir/Logger.cpp.o: In function `boost::log::v2_mt_posix::aux::record_pump<boost::log::v2_mt_posix::sources::severity_logger_mt<boost::log::v2_mt_posix::trivial::severity_level> >::~record_pump()':
/usr/local/include/boost/log/sources/record_ostream.hpp:278: undefined reference to `boost::log::v2_mt_posix::aux::unhandled_exception_count()'
CMakeFiles/BoostTest.dir/Logger.cpp.o: In function `boost::log::v2_mt_posix::aux::record_pump<boost::log::v2_mt_posix::sources::severity_logger_mt<boost::log::v2_mt_posix::trivial::severity_level> >::record_pump(boost::log::v2_mt_posix::sources::severity_logger_mt<boost::log::v2_mt_posix::trivial::severity_level>&, boost::log::v2_mt_posix::record&)':
/usr/local/include/boost/log/sources/record_ostream.hpp:258: undefined reference to `boost::log::v2_mt_posix::aux::stream_provider<char>::allocate_compound(boost::log::v2_mt_posix::record&)'
/usr/local/include/boost/log/sources/record_ostream.hpp:259: undefined reference to `boost::log::v2_mt_posix::aux::unhandled_exception_count()'
CMakeFiles/BoostTest.dir/Logger.cpp.o: In function `boost::log::v2_mt_posix::aux::record_pump<boost::log::v2_mt_posix::sources::severity_logger_mt<boost::log::v2_mt_posix::trivial::severity_level> >::auto_release::~auto_release()':
/usr/local/include/boost/log/sources/record_ostream.hpp:243: undefined reference to `boost::log::v2_mt_posix::aux::stream_provider<char>::release_compound(boost::log::v2_mt_posix::aux::stream_provider<char>::stream_compound*)'
CMakeFiles/BoostTest.dir/Logger.cpp.o: In function `boost::log::v2_mt_posix::sources::aux::severity_level<boost::log::v2_mt_posix::trivial::severity_level>::set_value(boost::log::v2_mt_posix::trivial::severity_level)':
/usr/local/include/boost/log/sources/severity_feature.hpp:135: undefined reference to `boost::log::v2_mt_posix::sources::aux::get_severity_level()'
CMakeFiles/BoostTest.dir/Logger.cpp.o: In function `boost::log::v2_mt_posix::record boost::log::v2_mt_posix::sources::basic_logger<char, boost::log::v2_mt_posix::sources::severity_logger_mt<boost::log::v2_mt_posix::trivial::severity_level>, boost::log::v2_mt_posix::sources::multi_thread_model<boost::log::v2_mt_posix::aux::light_rw_mutex> >::open_record_unlocked<boost::parameter::aux::tagged_argument<boost::log::v2_mt_posix::keywords::tag::severity, boost::log::v2_mt_posix::trivial::severity_level const> >(boost::parameter::aux::tagged_argument<boost::log::v2_mt_posix::keywords::tag::severity, boost::log::v2_mt_posix::trivial::severity_level const> const&)':
/usr/local/include/boost/log/sources/basic_logger.hpp:259: undefined reference to `boost::log::v2_mt_posix::core::open_record(boost::log::v2_mt_posix::attribute_set const&)'
CMakeFiles/BoostTest.dir/Logger.cpp.o: In function `boost::log::v2_mt_posix::core::push_record(boost::log::v2_mt_posix::record&&)':
/usr/local/include/boost/log/core/core.hpp:308: undefined reference to `boost::log::v2_mt_posix::core::push_record_move(boost::log::v2_mt_posix::record&)'
collect2: error: ld returned 1 exit status
make[3]: *** [BoostTest] Error 1
make[2]: *** [CMakeFiles/BoostTest.dir/all] Error 2
make[1]: *** [CMakeFiles/BoostTest.dir/rule] Error 2
make: *** [BoostTest] Error 2

解决方案

It looks like you installed a static version of boost.

The boost::log::v2_mt_posix namespace is implemented in dynamically built versions of boost (see this link). Your application will attempt to link against symbols from this namespace if you define the BOOST_LOG_DYN_LINK macro during compilation.

If you have the statically built version of Boost.Log installed to /usr/local, try removing the -DBOOST_LOG_DYN_LINK from your ${CMAKE_CXX_FLAGS} line, regenerate your build directory and attempt the build again. (Side note: typically you will add compiler definitions with the add_definitions() command, see this link)

Or, reinstall a dynamic version of boost.

这篇关于适当提高CMake的使用在Ubuntu上没有链接的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆