2017-07-05 80 views
0

我正在靜態鏈接增強。當我這樣做時,我會得到一些未定義的參考錯誤(下文)。引用未定義鏈接時提升1.63靜態庫

[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 

當我動態鏈接時,推測可能存在引用,並且構建鏈接成功。

我需要能夠建立這個靜態;項目的要求。

我正在用cmake建造。我的鏈接目錄,因此下令:

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 
) 

我的目標鏈接libaries被定義爲:

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/

我的理解是,如果鏈接器發現系統上的一個boost靜態庫安裝在正確的路徑之前。

的CMake似乎找到升壓1_63正確的路徑:構建:)

-- Boost version: 1.63.0 
-- Found the following Boost libraries: 
-- system 
-- chrono 
-- date_time 
-- filesystem 
-- program_options 
-- regex 
-- thread 

我運行的Fedora 25中

(輸出,升壓所以我的系統上安裝的版本是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 

我建,但不要安裝1.63在我的源代碼樹的第三方目錄。它的建成使用以下命令:

./bootstrap.sh 
./b2 -j8 

我設置與接頭輸出:

SET (CMAKE_EXE_LINKER_FLAGS -v) 

並決心通過下面的輸出是我鏈接到的正確的靜態libary:

-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 
... 

我已經用完了想法;有什麼我應該檢查?

+0

顯示導致錯誤的完整鏈接器命令行。 'libinfinite.a'需要在命令行中的boost庫之前。 –

+0

libinfinite.a需要在命令行中的boost庫之前 - 這解決了問題 - 謝謝! –

回答

1

libinfinite.a需要在命令行中的boost庫之前。