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);
}
}
Vous avez probablement besoin d'ajouter plus de librairies sur lesquelles 'libboost_filesystem.a' dépend. – user0042
@ user0042 Vous avez raison, j'avais besoin d'ajouter 'iostreams'. – N08
@ user0042 Le lien statique ne fonctionne pas. Est-ce que tu sais pourquoi? – N08