#include boost без использования libs linux - PullRequest
1 голос
/ 25 ноября 2010

Проблема: в данный момент я компилирую в Ubuntu, но мой сервер работает под управлением Fedora / Redhat. Ubunutu использует boost 1.42, а последняя версия linux на данный момент - 1.41. Итак, я решил скачать boost lib и поместить его в папку моего рабочего пространства

Вот структура каталогов

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

В моем main.cpp у меня есть этот код

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

Это вообще возможно или я лаю не на том дереве. Я пытался скомпилировать его, но это не удалось (конечно) с 13 ошибками

Если я пропустил какую-то информацию, пожалуйста, спросите ее, попробуйте предоставить ее

Создать файл (Моя программа называется 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: $@'
    @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: $@'
    @echo ' '

#     Other Targets
clean:
    -$(RM) $(OBJS)$(C++_DEPS)$(C_DEPS)$(CC_DEPS)$(CPP_DEPS)$(EXECUTABLES)$(CXX_DEPS)$(C_UPPER_DEPS) vlogd
    -@echo ' '

.PHONY: all clean dependents
.SECONDARY:

-include ../makefile.targets

Файл объекта

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

USER_OBJS :=

LIBS := -lmysqlclient -lboost_regex

Ответы [ 2 ]

5 голосов
/ 25 ноября 2010

Нет необходимости включать использование полного пути, если вы используете gcc, просто укажите правильный путь включения и путь ссылки

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

Таким образом, все #include <boost/...> заголовки и библиотеки будут сначала найдены в вашемlocal boost.

Edit
После вопроса в комментарии.

По умолчанию -l будет искать библиотеки .so.Так что если буст построен, например, с libboost_regex.so и liboost_regex.a, то по умолчанию вы будете ссылаться на .so.Если вы связаны с .so, на работающем сервере вам необходимо иметь правильные версии этих библиотек (можно установить несколько буст-версий).

Если вы хотите неявно ссылаться на статические версии, либоиспользуйте полный путь

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

или

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

или (в более новых версиях ld)

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

Наличие двоичного файла с командой lddвы можете увидеть его зависимости от общей библиотеки и проверить, есть ли среди них улучшенные

ldd ./yourapp
1 голос
/ 25 ноября 2010

Хороший способ создания расширенных библиотек в ваших приложениях - это создание ваших приложений с помощью bjam (при всей его кроссплатформенности)

Я решаю вашу проблему примерно так - вы можете посмотреть общую документацию http://www.boost.org/doc/tools/build/doc/html/index.html

В моем jamroot.jam (в основе моего проекта) - ваша папка / рабочая область - у меня есть

#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 ;

Затем в каталоге myprogram / build у меня есть файл с именем 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 ; 

Надеюсь, это поможет. Я скопировал это из моих файлов, так что надеюсь, что они будут работать - однако есть вероятность, что я допустил ошибку, поместив в них структуру ваших каталогов. Дайте мне знать, если это не сработает.

Преимущество этой системы в том, что вы фактически собираете библиотеку, поэтому все флаги компилятора будут правильными. Кроме того, если вы обновляете библиотеку, вам просто нужно изменить флаг BOOST_BASE. Кроме того, сборка должна работать на Windows и Linux без каких-либо изменений ....

Всего наилучшего,

Tom

...