Avatar billede mxs Nybegynder
28. marts 2009 - 16:07 Der er 11 kommentarer og
1 løsning

Boost filesystem linker fejl

Hej.

Jeg har prøvet at compile dette eksempel:

//  simple_ls program  -------------------------------------------------------//

//  Copyright Jeff Garland and Beman Dawes, 2002

//  Use, modification, and distribution is subject to the Boost Software
//  License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
//  http://www.boost.org/LICENSE_1_0.txt)

//  See http://www.boost.org/libs/filesystem for documentation.

//  As an example program, we don't want to use any deprecated features
#define BOOST_FILESYSTEM_NO_DEPRECATED

#include "boost/filesystem/operations.hpp"
#include "boost/filesystem/path.hpp"
#include "boost/progress.hpp"
#include <iostream>

namespace fs = boost::filesystem;

int main( int argc, char* argv[] )
{
  boost::progress_timer t( std::clog );

  fs::path full_path( fs::initial_path<fs::path>() );

  if ( argc > 1 )
    full_path = fs::system_complete( fs::path( argv[1] ) );
  else
    std::cout << "\nusage:  simple_ls [path]" << std::endl;

  unsigned long file_count = 0;
  unsigned long dir_count = 0;
  unsigned long other_count = 0;
  unsigned long err_count = 0;

  if ( !fs::exists( full_path ) )
  {
    std::cout << "\nNot found: " << full_path.file_string() << std::endl;
    return 1;
  }

  if ( fs::is_directory( full_path ) )
  {
    std::cout << "\nIn directory: "
              << full_path.directory_string() << "\n\n";
    fs::directory_iterator end_iter;
    for ( fs::directory_iterator dir_itr( full_path );
          dir_itr != end_iter;
          ++dir_itr )
    {
      try
      {
        if ( fs::is_directory( dir_itr->status() ) )
        {
          ++dir_count;
          std::cout << dir_itr->path().filename() << " [directory]\n";
        }
        else if ( fs::is_regular_file( dir_itr->status() ) )
        {
          ++file_count;
          std::cout << dir_itr->path().filename() << "\n";
        }
        else
        {
          ++other_count;
          std::cout << dir_itr->path().filename() << " [other]\n";
        }

      }
      catch ( const std::exception & ex )
      {
        ++err_count;
        std::cout << dir_itr->path().filename() << " " << ex.what() << std::endl;
      }
    }
    std::cout << "\n" << file_count << " files\n"
              << dir_count << " directories\n"
              << other_count << " others\n"
              << err_count << " errors\n";
  }
  else // must be a file
  {
    std::cout << "\nFound: " << full_path.file_string() << "\n";   
  }
  return 0;
}

med følgende:
g++ -I /usr/local/include/boost-1_38/ boost-filesystem-test.cpp -o bfs -lboost_filesystem

men før denne fejl:
ld: library not found for -lboost_filesystem
collect2: ld returned 1 exit status

Bemærk venligst at jeg også har prøvet at henvise explicit til hvor min libs ligger med -L /usr/local/lib/. Dette virker dog heller lige lidt.

Jeg har selv installeret/kompileret boost-1.38.
Mit system er en macbook OS X 10.5.6

Min boost libs ligger i /usr/local/lib og mine boost includes ligger i /usr/local/include/boost-1_38/boost/

Jeg kan ikke forstå hvorfor den ikke kan finde min filesystem lib. En ls på /usr/local/lib viser at disse boost_filesystem libraries ligger der:
libboost_filesystem-xgcc40-mt-1_38.a
2 libboost_filesystem-xgcc40-mt-1_38.dylib
libboost_filesystem-xgcc40-mt.a -> libboost_filesystem-xgcc40-mt-1_38.a
libboost_filesystem-xgcc40-mt.dylib -> libboost_filesystem-xgcc40-mt-1_38.dylib

Jeg forstår ikke lige hvorfor min linker ikke kan finde de dynamiske biblioteker.
Jeg har rodet med det i lidt tit. Googlet lidt, men jeg kan bare ikke se hvad det er jeg gør galt. Sikkert noget basalt, dog kan jeg ikke lige se hvad.
Avatar billede arne_v Ekspert
28. marts 2009 - 16:14 #1
-lboost_filesystem

forsøger at linke med libboost_filesystem.a - findes den ?
Avatar billede mxs Nybegynder
28. marts 2009 - 16:20 #2
Der findes en libboost_filesystem-xgcc40-mt.a og en libboost_filesystem-xgcc40-mt-1_38.a
Hvorfor der findes to, ved jeg ikke.

Prøver jeg følgende
g++ -I /usr/local/include/boost-1_38/ -L /usr/local/lib/ boost-filesystem-test.cpp -lboost_date_time-xgcc40-mt -o bfs

Får jeg fejlen
ld: in /usr/local/lib/, can't map file, errno=22
collect2: ld returned 1 exit status
Avatar billede mxs Nybegynder
28. marts 2009 - 16:23 #3
Undskyld
Fejl i overstående!! Staveplade til mig selv.

Jeg prøver selvfølgelig at compile med
g++ -I /usr/local/include/boost-1_38/ -L /usr/local/lib/ boost-filesystem-test.cpp -lboost_filesystem-xgcc40-mt-1_38 -o bfs

Får stadig fejlen
ld: in /usr/local/lib/, can't map file, errno=22
collect2: ld returned 1 exit status
Avatar billede arne_v Ekspert
28. marts 2009 - 16:32 #4
Prøv og fjern -L /usr/local/lib/
Avatar billede arne_v Ekspert
28. marts 2009 - 16:32 #5
Eller ret evt. til -L/usr/local/lib
Avatar billede mxs Nybegynder
28. marts 2009 - 16:50 #6
Hvis jeg retter til -L /usr/local/lib får jeg følgende:
martin-slots-macbook:C++ slot$ g++ -I /usr/local/include/boost-1_38/ -L /usr/local/lib boost-filesystem-test.cpp -lboost_filesystem-xgcc40-mt-1_38 -o bfs
ld: in /usr/local/lib, can't map file, errno=22
collect2: ld returned 1 exit status

Hvis jeg retter så jeg fjerner -L /usr/local/lib får jeg følgende:
martin-slots-macbook:C++ slot$ g++ -I /usr/local/include/boost-1_38/ boost-filesystem-test.cpp -lboost_filesystem-xgcc40-mt-1_38 -o bfs
Undefined symbols:
  "boost::system::get_generic_category()", referenced from:
      __static_initialization_and_destruction_0(int, int)in ccyEYsIr.o
      __static_initialization_and_destruction_0(int, int)in ccyEYsIr.o
      __static_initialization_and_destruction_0(int, int)in ccyEYsIr.o
  "boost::system::get_system_category()", referenced from:
      boost::system::error_code::error_code()in ccyEYsIr.o
      __static_initialization_and_destruction_0(int, int)in ccyEYsIr.o
      __static_initialization_and_destruction_0(int, int)in ccyEYsIr.o
ld: symbol(s) not found
collect2: ld returned 1 exit status


Jeg har et mellemrum mellem -L og /usr/local/lib. Hvis jeg skriver dette således -L/usr/local/lib eller -L/usr/local/lib/ får jeg følgende:
martin-slots-macbook:C++ slot$ g++ -I /usr/local/include/boost-1_38/ -L/usr/local/lib boost-filesystem-test.cpp -lboost_filesystem-xgcc40-mt-1_38 -o bfs
Undefined symbols:
  "boost::system::get_generic_category()", referenced from:
      __static_initialization_and_destruction_0(int, int)in ccZRqpLL.o
      __static_initialization_and_destruction_0(int, int)in ccZRqpLL.o
      __static_initialization_and_destruction_0(int, int)in ccZRqpLL.o
  "boost::system::get_system_category()", referenced from:
      boost::system::error_code::error_code()in ccZRqpLL.o
      __static_initialization_and_destruction_0(int, int)in ccZRqpLL.o
      __static_initialization_and_destruction_0(int, int)in ccZRqpLL.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
martin-slots-macbook:C++ slot$ g++ -I /usr/local/include/boost-1_38/ -L/usr/local/lib/ boost-filesystem-test.cpp -lboost_filesystem-xgcc40-mt-1_38 -o bfs
Undefined symbols:
  "boost::system::get_generic_category()", referenced from:
      __static_initialization_and_destruction_0(int, int)in ccgFTuop.o
      __static_initialization_and_destruction_0(int, int)in ccgFTuop.o
      __static_initialization_and_destruction_0(int, int)in ccgFTuop.o
  "boost::system::get_system_category()", referenced from:
      boost::system::error_code::error_code()in ccgFTuop.o
      __static_initialization_and_destruction_0(int, int)in ccgFTuop.o
      __static_initialization_and_destruction_0(int, int)in ccgFTuop.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
Avatar billede arne_v Ekspert
28. marts 2009 - 17:01 #7
Det er faktisk et skridt videre med de link fejl.

Jeg gætter på at du mangler en -lboost_system* hvor * er noget ligesom for boost_filesystem.
Avatar billede mxs Nybegynder
28. marts 2009 - 17:11 #8
Jeg kan faktisk godt følge dig i det! Da jeg kunne se at fejlmeddelsen:

Undefined symbols:
  "boost::system::get_generic_category()", referenced from:
      __static_initialization_and_destruction_0(int, int)in ccgFTuop.o
      __static_initialization_and_destruction_0(int, int)in ccgFTuop.o
      __static_initialization_and_destruction_0(int, int)in ccgFTuop.o
  "boost::system::get_system_category()", referenced from:
      boost::system::error_code::error_code()in ccgFTuop.o
      __static_initialization_and_destruction_0(int, int)in ccgFTuop.o
      __static_initialization_and_destruction_0(int, int)in ccgFTuop.o
ld: symbol(s) not found
collect2: ld returned 1 exit status

havde noget boost::system som den ikke kunne referencerer. Med følgende:
martin-slots-macbook:C++ slot$ g++ -I /usr/local/include/boost-1_38/ -L/usr/local/lib/ boost-filesystem-test.cpp -lboost_filesystem-xgcc40-mt-1_38 -lboost_system-xgcc40-mt-1_38 -o bfs

Virker det :)
Også hvis jeg ferner -L/usr/local/lib.
Men hvorfor er det lige at jeg ikke kan skrive "-L /usr/local/lib" med mellemrum? Eller "-L /usr/local/lib/"? Der får jeg netop fejlen:
ld: in /usr/local/lib/, can't map file, errno=22
collect2: ld returned 1 exit status

Dette er med boost_system biblioteket.
Avatar billede mxs Nybegynder
28. marts 2009 - 17:12 #9
Smid et svar forresten :) Du løste jo dette for mig.
Avatar billede arne_v Ekspert
28. marts 2009 - 17:21 #10
Jeg kender kun det principielle:

-L/foo -lbar

betyder link med /foo/libbar.a

Jeg har aldrig prøvet med en trailing slash.

Jeg har ingen anelse om hvorfor det ikke virker.

Og et svar.
Avatar billede mxs Nybegynder
28. marts 2009 - 17:23 #11
Jeg ved det heller ikke. Er stadig rimlig usikker i min toolchain, men jeg har da fået en intro kursus nu mht include paths, libraries og linkningen.
Avatar billede mxs Nybegynder
28. marts 2009 - 17:24 #12
Synes bare stadig det er svært at tyde g++ fejl output.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester