c++ - 为什么我的 C++ 链接器仅在删除 boost 共享目标文件后才起作用?

标签 c++ object boost debian shared

当我使用我的 NetBeans 生成的 Makefile 运行“make”时,一切都编译正常,但是当我们尝试将所有东西链接在一起时,我们得到一个错误:

g++     -o dist/Debug/GNU-Linux-x86/hub build/Debug/GNU-Linux-x86/Calculations.o build/Debug/GNU-Linux-x86/Client.o build/Debug/GNU-Linux-x86/Connection.o build/Debug/GNU-Linux-x86/DataStore.o build/Debug/GNU-Linux-x86/Hub.o build/Debug/GNU-Linux-x86/Instruments.o build/Debug/GNU-Linux-x86/Parameters.o build/Debug/GNU-Linux-x86/PricingEngine.o build/Debug/GNU-Linux-x86/Server.o build/Debug/GNU-Linux-x86/main.o build/Debug/GNU-Linux-x86/stdafx.o -L/usr/lib/x86_64-linux-gnu ../Core/dist/Debug/GNU-Linux-x86/libcore.a -pthread -lpq -lzmq -lboost_system -lboost_log -lboost_log_setup -lboost_thread -lboost_filesystem -lboost_unit_test_framework -lQuantLib
build/Debug/GNU-Linux-x86/Connection.o: In function `Hub::Connection::ReadHeaderHandler(boost::system::error_code, unsigned long)':
/home/jj5/arena/Hub/Connection.cpp:35: undefined reference to `boost::log::v2s_mt_posix::trivial::logger::get()'
/home/jj5/arena/Hub/Connection.cpp:35: undefined reference to `boost::log::v2s_mt_posix::trivial::logger::get()'
/home/jj5/arena/Hub/Connection.cpp:42: undefined reference to `boost::log::v2s_mt_posix::trivial::logger::get()'
/home/jj5/arena/Hub/Connection.cpp:42: undefined reference to `boost::log::v2s_mt_posix::trivial::logger::get()'

问题似乎是缺少 boost 日志库。然而奇怪的是,如果我删除 Boost 分片对象文件:

root@happiness:/usr/lib/x86_64-linux-gnu# archive libboost_*.so
Archive path is: /root/archive/2015-09-08-200813
Date: Tuesday 8 September  20:08:13 AEST 2015
User: root
Host: happiness
Path: /usr/lib/x86_64-linux-gnu
File: libboost_atomic.so libboost_chrono.so libboost_context.so libboost_date_time.so libboost_filesystem.so libboost_graph_parallel.so libboost_graph.so libboost_iostreams.so libboost_locale.so libboost_log_setup.so libboost_log.so libboost_math_c99f.so libboost_math_c99l.so libboost_math_c99.so libboost_math_tr1f.so libboost_math_tr1l.so libboost_math_tr1.so libboost_mpi_python-py27.so libboost_mpi_python-py34.so libboost_mpi_python.so libboost_mpi.so libboost_prg_exec_monitor.so libboost_program_options.so libboost_python-py27.so libboost_python-py34.so libboost_python.so libboost_random.so libboost_regex.so libboost_serialization.so libboost_signals.so libboost_system.so libboost_thread.so libboost_timer.so libboost_unit_test_framework.so libboost_wave.so libboost_wserialization.so

然后下次我运行 make 一切编译和链接成功!尽管如此,删除共享对象文件似乎有点过激……还有其他方法吗?

附注上面显示的“存档”脚本通过将文件移动到“垃圾箱”来“删除”文件,它类似于 rm -rf。

最佳答案

要让链接器更喜欢静态库,你可以试试这个:

-Wl,-Bstatic -lboost_log -lboost_log_setup -Wl,-Bdynamic

注意事项:

  • 我没有发现直接链接到 .a 有问题,它的可移植性与上述解决方案相比没有任何问题

  • Boost.Log 似乎无法设置这些符号的默认可见性,因此请确保已报告此问题。

关于c++ - 为什么我的 C++ 链接器仅在删除 boost 共享目标文件后才起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32455153/

相关文章:

c++ - 如何在boost C++中操作优先级队列中的元素

c++ - 中断任意等待操作

c++ - 我对值初始化的尝试被解释为函数声明,为什么 A a(());解决这个问题?

javascript - 我可以采取什么措施来减少我的点击事件代码?

c++ - 某个地方的节点类逻辑错误?

java - java对象类型的正确封装是什么

actionscript-3 - ActionScript - 比较和删除复杂数组的重复项?

c++ - 在内存中实现无限 map

c++ - 错误 LNK2019 : unresolved external symbol _lbfgs_ within GPLVM code

c++ - 构造函数和g++编译配方的问题