Programm kann nicht mit Boost.Filesystem verknüpft werden
Ich versuche ein Programm ausführen, mithilfe von Beispielcode von boost::filesystem auf Ubuntu 12.10, aber es nicht bauen wollen.
#include <iostream>
#include <boost/filesystem.hpp>
using namespace boost::filesystem;
using namespace std;
void fun(const string& dirPath);
int main()
{
fun("/home");
return 0;
}
void fun(const string& dirPath)
{
path p (dirPath);
if (exists(p))
{
if (is_regular_file(p))
cout << p << " size is " << file_size(p) << '\n';
else if (is_directory(p))
cout << p << "is a directory\n";
else
cout << p << "exists, but is neither a regular file nor a directory\n";
}
else
cout << p << "does not exist\n";
}
- Und CMake-code:
project(tttest)
cmake_minimum_required(VERSION 2.8)
aux_source_directory(. SRC_LIST)
add_executable(${PROJECT_NAME} ${SRC_LIST})
FIND_PACKAGE(Boost 1.53 COMPONENTS filesystem system REQUIRED)
include_directories(${Boost_INCLUDE_DIR})
link_directories(${Boost_LIBRARY_DIR})
TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${Boost_LIBRARIES})
Leider erzeugt es Fehler
CMakeFiles/tttest.dir/main.cpp.o: In function `boost::filesystem::exists(boost::filesystem::path const&)':
main.cpp:(.text._ZN5boost10filesystem6existsERKNS0_4pathE[_ZN5boost10filesystem6existsERKNS0_4pathE]+0x19): undefined reference to `boost::filesystem::detail::status(boost::filesystem::path const&, boost::system::error_code*)'
CMakeFiles/tttest.dir/main.cpp.o: In function `boost::filesystem::is_directory(boost::filesystem::path const&)':
main.cpp:(.text._ZN5boost10filesystem12is_directoryERKNS0_4pathE[_ZN5boost10filesystem12is_directoryERKNS0_4pathE]+0x19): undefined reference to `boost::filesystem::detail::status(boost::filesystem::path const&, boost::system::error_code*)'
CMakeFiles/tttest.dir/main.cpp.o: In function `boost::filesystem::is_regular_file(boost::filesystem::path const&)':
main.cpp:(.text._ZN5boost10filesystem15is_regular_fileERKNS0_4pathE[_ZN5boost10filesystem15is_regular_fileERKNS0_4pathE]+0x19): undefined reference to `boost::filesystem::detail::status(boost::filesystem::path const&, boost::system::error_code*)'
CMakeFiles/tttest.dir/main.cpp.o: In function `boost::filesystem::file_size(boost::filesystem::path const&)':
main.cpp:(.text._ZN5boost10filesystem9file_sizeERKNS0_4pathE[_ZN5boost10filesystem9file_sizeERKNS0_4pathE]+0x19): undefined reference to `boost::filesystem::detail::file_size(boost::filesystem::path const&, boost::system::error_code*)'
collect2: error: ld returned 1 exit status
Was ist die Ursache dieses Problems und wie es zu lösen?
Kommentar zu dem Problem - Öffnen
versuchen Sie, bauen Sie mit automatisch erkannt boost-version: FIND_PACKAGE(Boost-KOMPONENTEN-Dateisystem system ERFORDERLICH)
Ich fügte hinzu, cmake, um die tags. Das problem scheint zu sein, cmake Verwandte.
Boost 1.53 erkannt, indem Sie Ihre version von CMake? Sie können Sie drucken aus, was ${Boost_LIBRARIES} enthält in Ihrem CMakeLists.txt um besser zu verstehen, was passiert ist. MESSAGE( status ${Boost_LIBRARIES} ) tun sollten.
InformationsquelleAutor der Frage adashie | 2013-03-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Boost-filesystem ist eine der Boost-library, die einige ABI-problem relativ zur Funktion Unterschrift ändern sich aufgrund der C++0x und C++11. cf-Boost-ticket : https://svn.boost.org/trac/boost/ticket/6779
Haben Sie drei Lösungen:
Hemmen C++11-scoped enums in den entsprechenden Boost-header-Dateien enthalten in Ihrem Programm mit #include (cf http://www.ridgesolutions.ie/index.php/2013/05/30/boost-link-error-undefined-reference-to-boostfilesystemdetailcopy_file/):
Aber diese Lösung ist nicht vollständig und ich lese es nicht für alle Arbeit.
Bauen BOOST mit dem C++11-option (die gleichen Optionen, die Sie verwenden für Ihre Anwendung): http://hnrkptrsn.github.io/2013/02/26/c11-and-boost-setup-guide
Lese ich auch es funktioniert nicht für alle.
Einrichten einer cross-compiler, der eigens für Ihre Anwendung, wo Sie erstellen Sie alle Bibliotheken, die Sie brauchen, in einer dedizierten Umgebung. Das gewährleistet die Kohärenz und Stabilität sowie mehr Wartungsfreundlichkeit, und ist sicherlich die Lösung zu empfehlen.
Ich habe nicht gelesen, wenn es getestet wurde - vermutlich ja, und vermutlich funktioniert es. Trotzdem, die cross-Compilierung ist gut gemeistert, jetzt in der informatik. Sie finden viele gute tutorials und die Unterstützung. In Gentoo Linux haben Sie die wunderbare sys-devel/crossdev-Paket, die macht es sehr einfach.
In meinem Fall, die Lösung 1 hat das problem gelöst. Sobald ich anderen begegnen, werde ich wechseln Sie zu Lösung 3. So, ich habe es noch nicht getestet.
InformationsquelleAutor der Antwort lalebarde
Müssen Sie libboost_filesystem Bibliothek als Verlinkung. Oder libboost_filesystem-mt, wenn Ihre Anwendung ist multi-threaded. Wie diese:
InformationsquelleAutor der Antwort Nicolai Tufar
Für einige Schub-Module, müssen Sie kompilieren Bibliotheken und link (mit bootstrap.sh).
In Ihrem Fall haben Sie zum kompilieren und verknüpfen
Filesystem
, und probalblySystem
zuHaben Sie einen Blick hier
Zum Beispiel:
Wenn Sie einen Link auf Windows, werden Sie nicht haben, um manuell verknüpfen Sie Ihre Bibliotheken, da Sie automatisch verbunden mit pragma. Auf Linux, Sie haben, es zu tun.
Gemäß der Dokumentation, die diese Module benötigen Sie zum Erwerb oder erstellen Sie eine Bibliothek :
InformationsquelleAutor der Antwort Cyrille
Benötigen Sie die folgenden Bibliotheken:
Wenn Sie eine Makefile:
InformationsquelleAutor der Antwort Akinna
Die Lösung, die für mich gearbeitet ist das kompilieren mit "-c" und erstellen Sie die ausführbare Datei wie dieser:
InformationsquelleAutor der Antwort Morad