2009-06-30 19 views
28

Yükseltme dosya sistemi kitaplığına bağlı bir C++ dosyası derlemek için bir cmake üretilen makefile kullanın. Aşağıdaki hatayı alıyorum Bağlama işlemi sırasında cmake ile boost.system bağlanma

:

Bazı googling bana gösterdi
 
cd /Users/janusz/Documents/workspace/ImageMarker/Debug/src && /opt/local/bin/cmake -E cmake_link_script CMakeFiles/ImageMarker.dir/link.txt --verbose=1 
/usr/bin/c++ -O3 -Wall -Wno-deprecated -g -verbose -Wl,-search_paths_first -headerpad_max_install_names -fPIC CMakeFiles/ImageMarker.dir/ImageMarker.cpp.o CMakeFiles/ImageMarker.dir/Image.cpp.o CMakeFiles/ImageMarker.dir/utils.cpp.o CMakeFiles/ImageMarker.dir/XMLWriter.cpp.o CMakeFiles/ImageMarker.dir/FaceRecognizer.cpp.o -o ImageMarker -L/opt/local/lib ../libTinyXml.a /opt/local/lib/libboost_filesystem-mt.dylib 

bu hata gibi görünüyor:

 
Undefined symbols: 
    "boost::system::get_generic_category()", referenced from: 
     __static_initialization_and_destruction_0(int, int)in FaceRecognizer.cpp.o 
     __static_initialization_and_destruction_0(int, int)in FaceRecognizer.cpp.o 
     __static_initialization_and_destruction_0(int, int)in FaceRecognizer.cpp.o 
    "boost::system::get_system_category()", referenced from: 
     __static_initialization_and_destruction_0(int, int)in FaceRecognizer.cpp.o 
     __static_initialization_and_destruction_0(int, int)in FaceRecognizer.cpp.o 
ld: symbol(s) not found 
collect2: ld returned 1 exit status 
make[2]: *** [src/ImageMarker] Error 1 

bu hatayı oluşturur makefile gelen eylem bu çizgidir bir boost.system kütüphanesine karşı bağlantı kurmak ya da boost.system kütüphanesine bağlı olarak projemi yapmak zorunda olduğum için destek dosyası sistem kütüphanesi ile maclarda ortak olun.

Kütüphane yolunu kodlamadan cmake'yi kitaplığa karşı bağlama konusunda nasıl zorlarım? otool dan İşte sonucu

: linux üzerinde

otool -L /opt/local/lib/libboost_filesystem-mt.dylib 
/opt/local/lib/libboost_filesystem-mt.dylib: 
/opt/local/lib/libboost_filesystem-mt.dylib (compatibility version 0.0.0, current version 0.0.0) 
/opt/local/lib/libboost_system-mt.dylib (compatibility version 0.0.0, current version 0.0.0) 
/usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.4.0) 
/usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0) 
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 111.0.0) 
+0

Janusz, lütfen "otool -L /opt/local/lib/libboost_filesystem-mt.dylib" işlemini yapın ve bize sonucu verin. Teşekkürler. –

cevap

60

CKağıt boost_filesystem boost_system karşı bağlantılı olduğunu kendisini düşünür. Açıkçası Mac üzerinde açıkça söylemek zorunda:

find_package(Boost COMPONENTS system filesystem REQUIRED) 
#... 
target_link_libraries(mytarget 
    ${Boost_FILESYSTEM_LIBRARY} 
    ${Boost_SYSTEM_LIBRARY} 
) 
+0

Bu çok tuhaf. Linux'ta, boost.filesystem dinamik kütüphanesi boost.system kütüphanesine başvurur, bu yüzden boost.system'e açık bir bağlantı kurulmasına gerek yoktur. Bunun neden burada olmadığına dair bir fikrin var mı? –

+0

Haklısınız, ldd libboost_filesystem.so listesi libboost_system.so (0x00007fcd31e67000). Mac "otool -L" üzerindeki AFAIK, ldd'ye eşdeğerdir, ancak etrafta Mac yok. Bunu ML'ye yükseltmek zorunda mıyız? –

+9

Bunun yerine $ {Boost_LIBRARIES} kullanılmasına ne dersiniz? Her zaman COMPONENTS tarafından belirtilen her şeyi içermelidir, değil mi? – LiMuBei

5

Bu yayınlanmıştır sorusuna "cevap", ama benim Ubuntu kutusunda bir gözlem değil. '

target_link_libraries(binary 
    ${Boost_FILESYSTEM_LIBRARY} 
    ${Boost_SYSTEM_LIBRARY} 
    ${Boost_REGEX_LIBRARY} 
) 

ve aşağıdaki yolu değil mi:

Ayrıca
find_package(Boost COMPONENTS regex system filesystem REQUIRED) 

, bunu bu şekilde bağlamak gerekir:

açıkça böyle bir şey yazmak zorunda, Boost kütüphanelerini kullanmak için t En azından benim için:

Bu, Maik'in söylediği, ancak sadece Mac'te değil.