2010-11-25 3 views
0

Le problème: Pour le moment, je compile sur Ubuntu mais mon serveur exécute Fedora/Redhat. Ubunutu utilise boost 1.42 et linux dernier en ce moment même est 1.41. Alors, que j'ai décidé était de télécharger le répertoire lib boost et le mettre dans le dossier de mon espace de travail#include boost sans utiliser libs linux

Voici la structure de répertoire

/workspace 
    /myprogram 
     /src 
      /main.cpp 
     /Debug 
      /main 
    /boost_1_42_0 
     /downloaded from boost.com 

Dans mon main.cpp, j'ai ce code

#include "../../boost_1_42_0/boost/regex.hpp" 

Est-ce que c'est même posible ou suis-je aboyer le mauvais arbre. J'ai essayé de le compiler, mais il a échoué (ofcourse) avec 13 erreurs

Si j'ai raté quelques informations s'il vous plaît demander, il essayer fournissant

Créer un fichier (Mon programme est appelé vlogd)

################################################################################ 
# Automatically-generated file. Do not edit! 
################################################################################ 

-include ../makefile.init 

RM := rm -rf 

# All of the sources participating in the build are defined here 
-include sources.mk 
-include subdir.mk 
-include src/subdir.mk 
-include src/class/vException/subdir.mk 
-include src/class/mysqlcppapi/subdir.mk 
-include src/class/mysqlcppapi/row/subdir.mk 
-include src/class/mysqlcppapi/query_results/subdir.mk 
-include src/class/mysqlcppapi/query/subdir.mk 
-include src/class/mysqlcppapi/fields/subdir.mk 
-include src/class/mysqlcppapi/exceptions/subdir.mk 
-include src/class/mysqlcppapi/datetime/subdir.mk 
-include objects.mk 

ifneq ($(MAKECMDGOALS),clean) 
ifneq ($(strip $(C++_DEPS)),) 
-include $(C++_DEPS) 
endif 
ifneq ($(strip $(C_DEPS)),) 
-include $(C_DEPS) 
endif 
ifneq ($(strip $(CC_DEPS)),) 
-include $(CC_DEPS) 
endif 
ifneq ($(strip $(CPP_DEPS)),) 
-include $(CPP_DEPS) 
endif 
ifneq ($(strip $(CXX_DEPS)),) 
-include $(CXX_DEPS) 
endif 
ifneq ($(strip $(C_UPPER_DEPS)),) 
-include $(C_UPPER_DEPS) 
endif 
endif 

-include ../makefile.defs 

# Add inputs and outputs from these tool invocations to the build variables 

# All Target 
all: vlogd 

# Tool invocations 
vlogd: $(OBJS) $(USER_OBJS) 
    @echo 'Building target: [email protected]' 
    @echo 'Invoking: GCC C++ Linker' 
    g++ -L/usr/lib64/mysql -L../../boost_1_42_0/lib/ -o"vlogd" $(OBJS) $(USER_OBJS) $(LIBS) 
    @echo 'Finished building target: [email protected]' 
    @echo ' ' 

#  Other Targets 
clean: 
    -$(RM) $(OBJS)$(C++_DEPS)$(C_DEPS)$(CC_DEPS)$(CPP_DEPS)$(EXECUTABLES)$(CXX_DEPS)$(C_UPPER_DEPS) vlogd 
    [email protected] ' ' 

.PHONY: all clean dependents 
.SECONDARY: 

-include ../makefile.targets 

objet fichier

################################################################################ 
# Automatically-generated file. Do not edit! 
################################################################################ 

USER_OBJS := 

LIBS := -lmysqlclient -lboost_regex 

Répondre

5

Pas besoin d'inclure l'utilisation de f chemin ULL, si vous utilisez gcc simplement spécifier le chemin de recherche correct et le chemin de liaison

gcc -I../../boost_1_42_0/ myprogram.cpp -L../../boost_1_42_0/lib -lboostXYZ 

Ainsi, tous les #include <boost/...> têtes et les bibliothèques seront tout d'abord recherché dans votre coup de pouce local.

Modifier
Suite à la question dans le commentaire.

Par défaut, -l recherche les bibliothèques .so. Donc, si boost est construit avec par exemple libboost_regex.so et liboost_regex.a, puis par défaut vous lierez au .so. Si vous êtes lié à .so, sur le serveur de travail, vous devez avoir les versions correctes de ces bibliothèques (plusieurs versions de boost peuvent être installées).

Si vous souhaitez lier implicitement aux versions statiques, utilisez le chemin complet

gcc .... ../../boost_1_42_0/lib/libboost_regex.a 

ou

gcc ... -Wl,-Bstatic -L../../boost_1_42_0/lib -lboost_regex -Wl,-Bdynamic 

ou (dans les versions les plus récentes de ld)

gcc ... -L../../boost_1_42_0/lib -l:libboost_regex.a 

Avoir la commande binaire avec ldd vous pouvez voir sa dépendance de bibliothèque partagée s et vérifier si les boost sont parmi les

ldd ./yourapp 
+0

Est-ce que je dois aussi copier les fichiers de boost sur mon serveur de travail. Ou seront-ils compilés dans mon programme? –

+0

en utilisant g ++, Dois-je copier et coller le makefile eclipse fait pour moi –

+0

La plupart des bibliothèques Boost sont en-têtes seulement. En tant que tels, ils seront compilés dans votre programme, il n'est donc pas nécessaire de copier les fichiers Boost sur la machine cible. – CadentOrange

1

Je belle façon de construire des bibliothèques de stimuler dans vos applications est de construire vos applications avec bjam (avec toute sa convivialité multi-plateforme)

Je résoudre votre problème comme si - vous pouvez regarder ici la documentation générale http://www.boost.org/doc/tools/build/doc/html/index.html

Dans mon jamroot.jam (à la base de mon projet) - votre/espace de travail dossier- Je

#Name this location $(TOP), 
path-constant TOP : . ; 
## The location of the boost library 
path-constant BOOST_BASE : ($TOP)/boost_1_42_0 ; 

#Define an alias to the regex libray 
alias regex-library  
     : $(BOOST_BASE)/libs/regex/build//boost_regex 
     : <include>$(BOOST_BASE) ; 


# build your project file 
build-project ./myprogram/build ; 

ensuite dans le répertoire myprogram/build J'ai un fichier appelé Jamfile.v2

project myprogram 
    : source-location ../src #your src directory 
    : requirements <include>../srC#your headerfiles can be in a different place if you wish 
      <warnings>all 
    : default-build <threading>multi # for example 
    : build-dir $(TOP)/build #where you want your object files put 
; 

exe myprogram : main.cpp 
       $(TOP)//regex-library # bjam should sort out the rest 
     : 
    <include> # any other includes 
    ; 

alias install : install-bin ; 
# where you want your program installed 
install install-bin : myprogram : <location>$(TOP)/bin ; 

Hope this helps. J'ai copié ceci hors de mes dossiers ainsi j'espère qu'ils devraient fonctionner - cependant il y a une chance que je me suis trompé en mettant votre structure de répertoire dans eux. Faites-moi savoir si cela ne fonctionne pas.

L'avantage de ce système est que vous construisez réellement la bibliothèque - ainsi tous les drapeaux du compilateur seront corrects. En outre, si vous mettez à niveau la bibliothèque, vous devriez juste changer l'indicateur BOOST_BASE. En outre, la construction devrait fonctionner sur Windows et Linux sans modification ....

Tous les meilleurs,

Tom

Questions connexes