体系结构的未定义符号 x86_64:OS X、Boost Log、CMake
Undefined symbols for architecture x86_64: OS X, Boost Log, CMake
还有 linking
的另一个问题
OS X 10.9.5 x64
正在使用 CMake 工具链构建跨平台项目。使用提升。
使用 Boost Log 对所有可执行文件进行 link 错误(BOOST_PATH 确实找到了,单元测试 link 使用 Boost 测试成功)
先试试。使用 Clang
gcc -v
Apple LLVM version 6.0 (clang-600.0.56) (based on LLVM 3.5svn)
Target: x86_64-apple-darwin13.4.0
Thread model: posix
建筑提升
./bootstrap && ./b2 threading=multi link=static runtime-link=static install
成功完成
...updated 638 targets...
链接说明:
if( ("UNIX") AND ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") )
# using Clang
message("UNIX configuration, Clang")
set(CMAKE_CXX_FLAGS "-std=c++11")
set(CMAKE_EXE_LINKER_FLAGS "-std=c++11 -Wl")
将库链接到可执行文件
add_executable(${TARGET} ${SOURCES})
if( ("UNIX") AND ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") )
# using Clang
message("UNIX configuration, Clang")
target_link_libraries(${TARGET}
libhelpers.a
libopenvpn_manager.a
${Boost_LOG_LIBRARY}
${Boost_LOG_SETUP_LIBRARY}
${Boost_SYSTEM_LIBRARY}
${Boost_FILESYSTEM_LIBRARY})
正在生成 makefile:
cmake -DCMAKE_OSX_ARCHITECTURES=x86_64 -DCMAKE_C_COMPILER=/usr/bin/clang -DCMAKE_CXX_COMPILER=/usr/bin/clang++exit .
链接器输出(选择了一些行):
Undefined symbols for architecture x86_64:
"boost::detail::get_tss_data(void const*)", referenced from:
boost::log::v2s_mt_posix::core::add_thread_attribute(boost::log::v2s_mt_posix::attribute_name const&, boost::log::v2s_mt_posix::attribute const&) in libboost_log.a(core.o)
boost::log::v2s_mt_posix::core::remove_thread_attribute(boost::log::v2s_mt_posix::attribute_set::iter<false>) in libboost_log.a(core.o)
boost::log::v2s_mt_posix::core::get_thread_attributes() const in libboost_log.a(core.o)
...
"boost::detail::set_tss_data(void const*, boost::shared_ptr<boost::detail::tss_cleanup_function>, void*, bool)", referenced from:
boost::thread_specific_ptr<boost::log::v2s_mt_posix::core::implementation::thread_data>::reset(boost::log::v2s_mt_posix::core::implementation::thread_data*) in libboost_log.a(core.o)
...
"boost::detail::thread_data_base::~thread_data_base()", referenced from:
boost::detail::thread_data<boost::_bi::bind_t<unsigned long, boost::_mfi::mf0<unsigned long, boost::asio::io_service>, boost::_bi::list1<boost::_bi::value<boost::asio::io_service*> > > >::~thread_data() in openvpn_test_app.cpp.o
…
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
第二次尝试。使用 GCC
我是如何将其设置为默认值的
#!/bin/bash
cd /usr/bin
rm cc gcc c++ g++
ln -s /usr/local/bin/gcc-4.9 cc
ln -s /usr/local/bin/gcc-4.9 gcc
ln -s /usr/local/bin/c++-4.9 c++
ln -s /usr/local/bin/g++-4.9 g++
gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/local/Cellar/gcc/4.9.1/libexec/gcc/x86_64-apple-darwin13.2.0/4.9.1/lto-wrapper
Target: x86_64-apple-darwin13.2.0
Configured with: ../configure --build=x86_64-apple-darwin13.2.0 --prefix=/usr/local/Cellar/gcc/4.9.1 --enable-languages=c,c++,objc,obj-c++,fortran --program-suffix=-4.9 --with-gmp=/usr/local/opt/gmp --with-mpfr=/usr/local/opt/mpfr --with-mpc=/usr/local/opt/libmpc --with-cloog=/usr/local/opt/cloog --with-isl=/usr/local/opt/isl --with-system-zlib --enable-version-specific-runtime-libs --enable-libstdcxx-time=yes --enable-stage1-checking --enable-checking=release --enable-lto --disable-werror --with-pkgversion='Homebrew gcc 4.9.1' --with-bugurl=https://github.com/Homebrew/homebrew/issues --enable-plugin --disable-nls --enable-multilib
Thread model: posix
gcc version 4.9.1 (Homebrew gcc 4.9.1)
以与之前相同的方式构建 Boost
链接说明
elseif( ("UNIX") AND ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") )
# using GCC
message("UNIX congiguration, GCC")
set(CMAKE_CXX_FLAGS "-std=c++11 -pthread")
set(CMAKE_EXE_LINKER_FLAGS "-std=c++11 -pthread")
以与 Clang 相同的方式将库链接到可执行文件
target_link_libraries(${TARGET}
libhelpers.a
libopenvpn_manager.a
${Boost_LOG_LIBRARY}
${Boost_LOG_SETUP_LIBRARY}
${Boost_SYSTEM_LIBRARY}
${Boost_FILESYSTEM_LIBRARY})
正在生成 makefile
cmake -DCMAKE_OSX_ARCHITECTURES=x86_64 -DCMAKE_C_COMPILER=/usr/bin/gcc -DCMAKE_CXX_COMPILER=/usr/bin/g++ .
链接器输出:
Undefined symbols for architecture x86_64:
"boost::detail::get_tss_data(void const*)", referenced from:
boost::log::v2s_mt_posix::core::set_thread_attributes(boost::log::v2s_mt_posix::attribute_set const&) in libboost_log.a(core.o)
boost::log::v2s_mt_posix::core::get_thread_attributes() const in libboost_log.a(core.o)
boost::log::v2s_mt_posix::core::remove_thread_attribute(boost::log::v2s_mt_posix::attribute_set::iter<false>) in libboost_log.a(core.o)
…
ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status
我没看到
find_package(Boost COMPONENTS filesystem system .... etc... )
在你的例子中的任何地方。例如,您需要它才能定义 Boost_FILESYSTEM_LIBRARY。您可以使用 CMake 命令
message("Boost_FILESYSTEM_LIBRARY: ${Boost_FILESYSTEM_LIBRARY}")
查看Boost_FILESYSTEM_LIBRARY的当前值。所有这些库名称都在 findBoost.cmake 模块中设置。
您缺少的符号来自 Boost.Thread,它被 Boost.Log 在多线程配置中使用。您需要将 "thread" 组件添加到 find_package 行,并将 Boost_THREAD_LIBRARY 变量添加到 target_link_libraries 行。请注意,您可能需要确保 target_link_libraries 行中的库顺序正确,以避免符号依赖解析顺序导致的链接错误(叶依赖应最后指定)。例如:
find_package(Boost COMPONENTS log log_setup thread filesystem system)
target_link_libraries(${TARGET}
${Boost_LOG_SETUP_LIBRARY}
${Boost_LOG_LIBRARY}
${Boost_FILESYSTEM_LIBRARY}
${Boost_THREAD_LIBRARY}
${Boost_SYSTEM_LIBRARY}
)
根据您使用的功能,您可能需要类似地添加 Boost.Regex 和 Boost.DateTime 的链接。
还有 linking
的另一个问题OS X 10.9.5 x64
正在使用 CMake 工具链构建跨平台项目。使用提升。
使用 Boost Log 对所有可执行文件进行 link 错误(BOOST_PATH 确实找到了,单元测试 link 使用 Boost 测试成功)
先试试。使用 Clang
gcc -v
Apple LLVM version 6.0 (clang-600.0.56) (based on LLVM 3.5svn)
Target: x86_64-apple-darwin13.4.0
Thread model: posix
建筑提升
./bootstrap && ./b2 threading=multi link=static runtime-link=static install
成功完成
...updated 638 targets...
链接说明:
if( ("UNIX") AND ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") )
# using Clang
message("UNIX configuration, Clang")
set(CMAKE_CXX_FLAGS "-std=c++11")
set(CMAKE_EXE_LINKER_FLAGS "-std=c++11 -Wl")
将库链接到可执行文件
add_executable(${TARGET} ${SOURCES})
if( ("UNIX") AND ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") )
# using Clang
message("UNIX configuration, Clang")
target_link_libraries(${TARGET}
libhelpers.a
libopenvpn_manager.a
${Boost_LOG_LIBRARY}
${Boost_LOG_SETUP_LIBRARY}
${Boost_SYSTEM_LIBRARY}
${Boost_FILESYSTEM_LIBRARY})
正在生成 makefile:
cmake -DCMAKE_OSX_ARCHITECTURES=x86_64 -DCMAKE_C_COMPILER=/usr/bin/clang -DCMAKE_CXX_COMPILER=/usr/bin/clang++exit .
链接器输出(选择了一些行):
Undefined symbols for architecture x86_64:
"boost::detail::get_tss_data(void const*)", referenced from:
boost::log::v2s_mt_posix::core::add_thread_attribute(boost::log::v2s_mt_posix::attribute_name const&, boost::log::v2s_mt_posix::attribute const&) in libboost_log.a(core.o)
boost::log::v2s_mt_posix::core::remove_thread_attribute(boost::log::v2s_mt_posix::attribute_set::iter<false>) in libboost_log.a(core.o)
boost::log::v2s_mt_posix::core::get_thread_attributes() const in libboost_log.a(core.o)
...
"boost::detail::set_tss_data(void const*, boost::shared_ptr<boost::detail::tss_cleanup_function>, void*, bool)", referenced from:
boost::thread_specific_ptr<boost::log::v2s_mt_posix::core::implementation::thread_data>::reset(boost::log::v2s_mt_posix::core::implementation::thread_data*) in libboost_log.a(core.o)
...
"boost::detail::thread_data_base::~thread_data_base()", referenced from:
boost::detail::thread_data<boost::_bi::bind_t<unsigned long, boost::_mfi::mf0<unsigned long, boost::asio::io_service>, boost::_bi::list1<boost::_bi::value<boost::asio::io_service*> > > >::~thread_data() in openvpn_test_app.cpp.o
…
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
第二次尝试。使用 GCC
我是如何将其设置为默认值的
#!/bin/bash
cd /usr/bin
rm cc gcc c++ g++
ln -s /usr/local/bin/gcc-4.9 cc
ln -s /usr/local/bin/gcc-4.9 gcc
ln -s /usr/local/bin/c++-4.9 c++
ln -s /usr/local/bin/g++-4.9 g++
gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/local/Cellar/gcc/4.9.1/libexec/gcc/x86_64-apple-darwin13.2.0/4.9.1/lto-wrapper
Target: x86_64-apple-darwin13.2.0
Configured with: ../configure --build=x86_64-apple-darwin13.2.0 --prefix=/usr/local/Cellar/gcc/4.9.1 --enable-languages=c,c++,objc,obj-c++,fortran --program-suffix=-4.9 --with-gmp=/usr/local/opt/gmp --with-mpfr=/usr/local/opt/mpfr --with-mpc=/usr/local/opt/libmpc --with-cloog=/usr/local/opt/cloog --with-isl=/usr/local/opt/isl --with-system-zlib --enable-version-specific-runtime-libs --enable-libstdcxx-time=yes --enable-stage1-checking --enable-checking=release --enable-lto --disable-werror --with-pkgversion='Homebrew gcc 4.9.1' --with-bugurl=https://github.com/Homebrew/homebrew/issues --enable-plugin --disable-nls --enable-multilib
Thread model: posix
gcc version 4.9.1 (Homebrew gcc 4.9.1)
以与之前相同的方式构建 Boost
链接说明
elseif( ("UNIX") AND ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") )
# using GCC
message("UNIX congiguration, GCC")
set(CMAKE_CXX_FLAGS "-std=c++11 -pthread")
set(CMAKE_EXE_LINKER_FLAGS "-std=c++11 -pthread")
以与 Clang 相同的方式将库链接到可执行文件
target_link_libraries(${TARGET}
libhelpers.a
libopenvpn_manager.a
${Boost_LOG_LIBRARY}
${Boost_LOG_SETUP_LIBRARY}
${Boost_SYSTEM_LIBRARY}
${Boost_FILESYSTEM_LIBRARY})
正在生成 makefile
cmake -DCMAKE_OSX_ARCHITECTURES=x86_64 -DCMAKE_C_COMPILER=/usr/bin/gcc -DCMAKE_CXX_COMPILER=/usr/bin/g++ .
链接器输出:
Undefined symbols for architecture x86_64:
"boost::detail::get_tss_data(void const*)", referenced from:
boost::log::v2s_mt_posix::core::set_thread_attributes(boost::log::v2s_mt_posix::attribute_set const&) in libboost_log.a(core.o)
boost::log::v2s_mt_posix::core::get_thread_attributes() const in libboost_log.a(core.o)
boost::log::v2s_mt_posix::core::remove_thread_attribute(boost::log::v2s_mt_posix::attribute_set::iter<false>) in libboost_log.a(core.o)
…
ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status
我没看到
find_package(Boost COMPONENTS filesystem system .... etc... )
在你的例子中的任何地方。例如,您需要它才能定义 Boost_FILESYSTEM_LIBRARY。您可以使用 CMake 命令
message("Boost_FILESYSTEM_LIBRARY: ${Boost_FILESYSTEM_LIBRARY}")
查看Boost_FILESYSTEM_LIBRARY的当前值。所有这些库名称都在 findBoost.cmake 模块中设置。
您缺少的符号来自 Boost.Thread,它被 Boost.Log 在多线程配置中使用。您需要将 "thread" 组件添加到 find_package 行,并将 Boost_THREAD_LIBRARY 变量添加到 target_link_libraries 行。请注意,您可能需要确保 target_link_libraries 行中的库顺序正确,以避免符号依赖解析顺序导致的链接错误(叶依赖应最后指定)。例如:
find_package(Boost COMPONENTS log log_setup thread filesystem system)
target_link_libraries(${TARGET}
${Boost_LOG_SETUP_LIBRARY}
${Boost_LOG_LIBRARY}
${Boost_FILESYSTEM_LIBRARY}
${Boost_THREAD_LIBRARY}
${Boost_SYSTEM_LIBRARY}
)
根据您使用的功能,您可能需要类似地添加 Boost.Regex 和 Boost.DateTime 的链接。