链接到 boost 1.63 静态库时引用未定义
references undefined when linking against boost 1.63 static libs
我link反对静态提升。当我这样做时,我得到了一些未定义的引用错误(如下)。
[100%] Linking CXX executable infiniteTests
/home/wdog/src/protos/infinite/libinfinite.a(ServiceDiscovery.cpp.o): In function `boost::date_time::month_formatter<boost::gregorian::greg_month, boost::date_time::simple_format<char>, char>::format_month(boost::gregorian::greg_month const&, std::ostream&)':
/home/wdog/src/3rdp/boost_1_63_0/boost/date_time/date_formatting.hpp:44: undefined reference to `boost::gregorian::greg_month::as_short_string() const'
/home/wdog/src/3rdp/boost_1_63_0/boost/date_time/date_formatting.hpp:49: undefined reference to `boost::gregorian::greg_month::as_long_string() const'
collect2: error: ld returned 1 exit status
当我动态 link 时,引用可能存在,并且构建 link 成功。
我需要能够静态地构建它;项目要求。
我正在使用 cmake 进行构建。我的 link 目录是这样排序的:
link_directories(
$ENV{PROJECT_LIB_DIR}
$ENV{BOOST_LIBRARY_DIR}
$ENV{HIREDIS_LIB_DIR}
$ENV{LIBEVENT_LIB_DIR}
$ENV{PROJECT_ROOT}
/usr/lib
/usr/local/lib
)
我的目标 link 库定义为:
target_link_libraries(
${sThisProject}
${Boost_LIBRARIES}
libhiredis.a
libevent.a
libevent_core.a
libevent_pthreads.a
libssl.so
libcrypto.so
libpthread.so.0
)
这是我找到提升的 CMakeLists.txt 条目:
find_package( Boost 1.63 EXACT REQUIRED COMPONENTS system chrono date_time filesystem program_options regex thread REQUIRED )
我还设置了以下内容:
SET (Boost_NO_SYSTEM_PATHS ON)
SET (Boost_USE_STATIC_LIBS ON)
SET (Boost_USE_MULTITHREADED ON)
SET (Boost_USE_STATIC_RUNTIME ON)
我检查过我的 1.63 版本是否成功构建了适当的静态库 - libboost_date_time.a - 它存在于 ${BOOST}/stage/lib/
据我了解,如果 linker 在正确路径之前的系统安装中找到一个提升静态库,就会发生这种情况。
Cmake 似乎找到了 boost 的正确路径 1_63:
(构建期间的输出:)
-- Boost version: 1.63.0
-- Found the following Boost libraries:
-- system
-- chrono
-- date_time
-- filesystem
-- program_options
-- regex
-- thread
我是运行fedora 25,所以我系统安装的boost版本是1_60,为了避免上面的问题,我完全卸载了:
sudo dnf remove boost boost-atomic boost-chrono boost-container boost-context boost-coroutine boost-date-time boost-devel boost-filesystem boost-graph boost-iostreams boost-locale boost-log boost-math boost-program-options boost-python boost-random boost-regex boost-serialization boost-signals boost-system boost-test boost-thread boost-timer boost-type_erasure boost-wave
我在源代码树的第 3 方目录中构建但未安装 1.63。它是使用以下命令构建的:
./bootstrap.sh
./b2 -j8
我将 linker 输出设置为:
SET (CMAKE_EXE_LINKER_FLAGS -v)
并通过以下输出确定我link针对正确的静态库:
-o
...
/home/wdog/src/3rdp/boost_1_63_0/stage/lib/libboost_system.a
/home/wdog/src/3rdp/boost_1_63_0/stage/lib/libboost_chrono.a
**/home/wdog/src/3rdp/boost_1_63_0/stage/lib/libboost_date_time.a**
/home/wdog/src/3rdp/boost_1_63_0/stage/lib/libboost_filesystem.a
/home/wdog/src/3rdp/boost_1_63_0/stage/lib/libboost_program_options.a
/home/wdog/src/3rdp/boost_1_63_0/stage/lib/libboost_regex.a
/home/wdog/src/3rdp/boost_1_63_0/stage/lib/libboost_thread.a
...
我 运行 没主意了;还有什么我应该检查的吗?
libinfinite.a
需要在命令行中的 boost 库之前。
我link反对静态提升。当我这样做时,我得到了一些未定义的引用错误(如下)。
[100%] Linking CXX executable infiniteTests
/home/wdog/src/protos/infinite/libinfinite.a(ServiceDiscovery.cpp.o): In function `boost::date_time::month_formatter<boost::gregorian::greg_month, boost::date_time::simple_format<char>, char>::format_month(boost::gregorian::greg_month const&, std::ostream&)':
/home/wdog/src/3rdp/boost_1_63_0/boost/date_time/date_formatting.hpp:44: undefined reference to `boost::gregorian::greg_month::as_short_string() const'
/home/wdog/src/3rdp/boost_1_63_0/boost/date_time/date_formatting.hpp:49: undefined reference to `boost::gregorian::greg_month::as_long_string() const'
collect2: error: ld returned 1 exit status
当我动态 link 时,引用可能存在,并且构建 link 成功。
我需要能够静态地构建它;项目要求。
我正在使用 cmake 进行构建。我的 link 目录是这样排序的:
link_directories(
$ENV{PROJECT_LIB_DIR}
$ENV{BOOST_LIBRARY_DIR}
$ENV{HIREDIS_LIB_DIR}
$ENV{LIBEVENT_LIB_DIR}
$ENV{PROJECT_ROOT}
/usr/lib
/usr/local/lib
)
我的目标 link 库定义为:
target_link_libraries(
${sThisProject}
${Boost_LIBRARIES}
libhiredis.a
libevent.a
libevent_core.a
libevent_pthreads.a
libssl.so
libcrypto.so
libpthread.so.0
)
这是我找到提升的 CMakeLists.txt 条目:
find_package( Boost 1.63 EXACT REQUIRED COMPONENTS system chrono date_time filesystem program_options regex thread REQUIRED )
我还设置了以下内容:
SET (Boost_NO_SYSTEM_PATHS ON)
SET (Boost_USE_STATIC_LIBS ON)
SET (Boost_USE_MULTITHREADED ON)
SET (Boost_USE_STATIC_RUNTIME ON)
我检查过我的 1.63 版本是否成功构建了适当的静态库 - libboost_date_time.a - 它存在于 ${BOOST}/stage/lib/
据我了解,如果 linker 在正确路径之前的系统安装中找到一个提升静态库,就会发生这种情况。
Cmake 似乎找到了 boost 的正确路径 1_63:
(构建期间的输出:)
-- Boost version: 1.63.0
-- Found the following Boost libraries:
-- system
-- chrono
-- date_time
-- filesystem
-- program_options
-- regex
-- thread
我是运行fedora 25,所以我系统安装的boost版本是1_60,为了避免上面的问题,我完全卸载了:
sudo dnf remove boost boost-atomic boost-chrono boost-container boost-context boost-coroutine boost-date-time boost-devel boost-filesystem boost-graph boost-iostreams boost-locale boost-log boost-math boost-program-options boost-python boost-random boost-regex boost-serialization boost-signals boost-system boost-test boost-thread boost-timer boost-type_erasure boost-wave
我在源代码树的第 3 方目录中构建但未安装 1.63。它是使用以下命令构建的:
./bootstrap.sh
./b2 -j8
我将 linker 输出设置为:
SET (CMAKE_EXE_LINKER_FLAGS -v)
并通过以下输出确定我link针对正确的静态库:
-o
...
/home/wdog/src/3rdp/boost_1_63_0/stage/lib/libboost_system.a
/home/wdog/src/3rdp/boost_1_63_0/stage/lib/libboost_chrono.a
**/home/wdog/src/3rdp/boost_1_63_0/stage/lib/libboost_date_time.a**
/home/wdog/src/3rdp/boost_1_63_0/stage/lib/libboost_filesystem.a
/home/wdog/src/3rdp/boost_1_63_0/stage/lib/libboost_program_options.a
/home/wdog/src/3rdp/boost_1_63_0/stage/lib/libboost_regex.a
/home/wdog/src/3rdp/boost_1_63_0/stage/lib/libboost_thread.a
...
我 运行 没主意了;还有什么我应该检查的吗?
libinfinite.a
需要在命令行中的 boost 库之前。