2017-09-12 1 views
-1

J'essaie d'inclure une bibliothèque Boost dans mon programme, mais j'ai des difficultés à lier mon programme de manière statique. Je reçois un tas d'erreurs de liens même si j'ai ajouté -L/usr/include/boost/ -lboost_filesystem à mon makefile.Erreurs du lieur lors d'une tentative de liaison statique de Boost

Par exemple, lors de la compilation je reçois undefined reference to boost::iostreams::detail::gzip_footer::reset()'

Ma version de Boost est 1.61.0.2, je suis Ubuntu 16.10 (64 bits) et la version gcc 6.2.0 20161005. Mes bibliothèques Boost tels que accumulators, algorithms, ... sont situés dans /usr/include/boost, donc mon makefile ressemble à ceci:

CXX = g++ 
CXXFLAGS = -static -std=c++11 -Wall 
LDFLAGS = -L/usr/include/boost/ -lboost_filesystem 
DEPFLAGS = -MM 


SRC_DIR = ./src 
OBJ_DIR = ./obj 
SRC_EXT = .cpp 
OBJ_EXT = .o 

TARGET = main 

SRCS := $(wildcard $(SRC_DIR)/*$(SRC_EXT)) 
OBJS := $(SRCS:$(SRC_DIR)/%$(SRC_EXT)=$(OBJ_DIR)/%$(OBJ_EXT)) 
DEP = depend.main 


.PHONY: clean all depend 

all: $(TARGET) 

$(TARGET): $(OBJS) 
    @echo "-> linking [email protected]" 
    @$(CXX) $^ $(LDFLAGS) -o [email protected] 

$(OBJ_DIR)/%$(OBJ_EXT) : $(SRC_DIR)/%$(SRC_EXT) 
    @echo "-> compiling [email protected]" 
    @$(CXX) $(CXXFLAGS) -o [email protected] -c $< 

clean: 
    @echo "removing objects and main file" 
    @rm -f $(OBJS) $(TARGET) *.out 

$(SRC_DIR)/%.$(SRC_EXT): 
    $(CXX) $(DEPFLAGS) -MT \ 
    "$(subst $(SRC_DIR),$(OBJ_DIR),$(subst $(SRC_EXT),$(OBJ_EXT),[email protected]))" \ 
    $(addprefix ,[email protected]) >> $(DEP); 

clear_dependencies: 
    @echo "-> (re-)building dependencies"; 
    @$(RM) $(DEP) 

depend: clear_dependencies $(SRCS) 


-include $(DEP) 

Je suis en train de compiler le fichier suivant (un exemple trouvé en ligne)

#include <fstream> 
#include <iostream> 

#include <boost/iostreams/filtering_stream.hpp>  
#include <boost/iostreams/filtering_streambuf.hpp> 
#include <boost/iostreams/copy.hpp> 
#include <boost/iostreams/filter/gzip.hpp> 

namespace bo = boost::iostreams; 

int main() 
{ 
    { 
    std::ofstream ofile("hello.gz", std::ios_base::out | std::ios_base::binary); 
    bo::filtering_ostream out; 
    out.push(bo::gzip_compressor()); 
    out.push(ofile); 
    out << "This is a gz file\n"; 
    } 

    { 
    std::ifstream ifile("hello.gz", std::ios_base::in | std::ios_base::binary); 
    bo::filtering_streambuf<bo::input> in; 
    in.push(bo::gzip_decompressor()); 
    in.push(ifile); 
    boost::iostreams::copy(in, std::cout); 
    } 
} 
+1

Vous avez probablement besoin d'ajouter plus de librairies sur lesquelles 'libboost_filesystem.a' dépend. – user0042

+0

@ user0042 Vous avez raison, j'avais besoin d'ajouter 'iostreams'. – N08

+0

@ user0042 Le lien statique ne fonctionne pas. Est-ce que tu sais pourquoi? – N08

Répondre

1

Votre programme n'utilise pas du tout libboost_filesystem. La seule bibliothèque de boost dépend de liboost_iostreams.