2016-08-19 3 views
1

Ich entwickle eine Bibliothek (sagen wir mylibrary), die von einigen Anwendungen von Drittanbietern verwendet werden soll. Meine Bibliothek wird von cmake (auf CentOS 7 und g ++ 4.8) erstellt und kompiliert und verwendet einige Boost-Bibliotheken wie thread, log, system, filesystem und date_time (Version 1.61.0). Um meine Lib zu testen, habe ich einen sehr einfachen Tester entwickelt (nennen wir es Tester). Der Punkt ist, dass meine Bibliothek erfolgreich aufgebaut und verlinkt werden kann, der Tester aber nicht. Lassen Sie zeigen mir den Inhalt cmake Dateien unter:Die Verknüpfung mit einer statischen Bibliothek, die Boost-Bibliotheken verwendet, führt zu Verknüpfungsfehlern in cmake

Im Haupt cmake-Datei, die für den Aufbau mylibrary gewidmet ist, habe ich zusätzlichen Schub auf diese Weise:

set(Boost_USE_STATIC_LIBS ON) 
set(Boost_USE_MULTITHREADED ON) 
SET(Boost_ADDITIONAL_VERSIONS "1.51.0" "1.52.0" 
      "1.53.0" "1.54.0" "1.55.0" "1.56.0" "1.57.0" "1.58.0" 
      "1.60.0" "1.61.0" "1.61.0" "1.62.0" "1.63.0" "1.64.0") 
find_package(Threads) 
find_package(Boost REQUIRED) 
find_package(Boost 1.61.0 COMPONENTS thread log log_setup filesystem system date_time) 
include_directories(${Boost_INCLUDE_DIRS}) 
link_directories(${Boost_LIBRARY_DIRS}) 

die Bibliothek hinzuzufügen, habe ich verwendet diese Codezeilen:

set(MYLIBRARY_SRC 
    ${MYLIBRARY_SOURCE_DIR}/src/folder1/File1.cpp 
    ${MYLIBRARY_SOURCE_DIR}/src/folder2/File2.cpp 
    ${MYLIBRARY_SOURCE_DIR}/src/folder3/File3.cpp) 

add_library (mylibrary ${MYLIBRARY_SRC}) 

in den letzten Zeilen dieser cmake Dateien habe ich die Tester Verzeichnis auf diese Weise hinzugefügt:

if(ENABLE_TESTER) 
    message(STATUS "tester is enabled and will be built") 
    add_subdirectory (tester) 
endif(ENABLE_TESTER) 

und für den Tester, habe ich eine sehr einfache cmake-Datei wie folgt:

add_executable(tester tester.cpp) 
message(STATUS , "Boost_libraries are ${Boost_LIBRARIES}") 
target_link_libraries(tester mylibrary ${Boost_LIBRARIES}) 

Nun, wenn ich mein Projekt zu bauen, meine Bibliothek erfolgreich gebaut, aber wenn der Tester, das Gesicht zu verknüpfe geht I viele Linkerfehler wie folgt aus:

../../lib/mylibrary.a (Logger.cpp.o): In function `void boost::log::v2s_mt_posix::basic_formatting_ostream<char, std::char_traits<char>, std::allocator<char> >::aligned_write<wchar_t>(wchar_t const*, long)': 
/home/john/local/include/boost/log/utility/formatting_ostream.hpp:702: undefined reference to `boost::log::v2s_mt_posix::aux::code_convert(wchar_t const*, unsigned long, std::string&, std::locale const&)' 
/home/john/local/include/boost/log/utility/formatting_ostream.hpp:696: undefined reference to `boost::log::v2s_mt_posix::aux::code_convert(wchar_t const*, unsigned long, std::string&, std::locale const&)' 

der Punkt ist, dass ich die Boost_LIBRARIES vor Variable gedruckt Verknüpfung der Tester und alles scheint in Ordnung.

+0

Können Sie bitte den cmake-Code für mylibrary hinzufügen? – wasthishelpful

+0

Haben Sie diese [Antwort] (http://stackoverflow.com/a/35853967/5781248) überprüft? –

+0

@washishelfful Ich habe den Code hinzugefügt. – hsalimi

Antwort

0

Nun, die Ursache für dieses Problem war genau das gleiche gefragt in this question.

P. S. J. J. Hakala beantwortete diese Frage in den Kommentaren. Ich habe ihn gebeten, seine Antwort als Antwort zu schreiben, damit ich sie annehmen kann. Aber er hat noch nicht geantwortet und ich habe beschlossen, die Antwort selbst zu schreiben. Wenn diese Aktion aus Sicht von S.O. falsch ist oder wenn ich Moderatoren bitten sollte, mein Q-Duplikat zu machen, lass es mich wissen.

Verwandte Themen