-Поиск по дневнику

Поиск сообщений в rss_forum_sources_ru

 -Подписка по e-mail

 

 -Постоянные читатели

 -Статистика

Статистика LiveInternet.ru: показано количество хитов и посетителей
Создан: 29.07.2007
Записей:
Комментариев:
Написано: 80


Библиотека на С++ для вызова библиотеки на С в Linux

Пятница, 18 Сентября 2020 г. 15:23 + в цитатник
ЫукпШ:
Цитата Sunless @
Библиотека на С инклюдами не подключается у меня, либо что-то не так собираю. МОжете привести полную команду сборки для всех 3 файлов привести для Linux?

Как собрать .so библиотеку легко найти в Сети.
Но мне этого было не достаточно, поскольку надо было собирать
проект из нескольких библиотек и массы файлов.
Поэтому я на основе статьи:
gnumake
Сделал себе makefile.
Который позволяет собирать приложение из нескольких директорий.
1. Все файлы в каждой директории компилируются и заносятся в свою статическую библиотеку.
2. После этого все статические библиотеки подключаются при сборке.
При этом только необходимые для конкретной сборки модули извлекаются
из библиотек - так работает линкер.
3. Для добавления нового модуля в проект (и статическую библиотеку)
достаточно его скопировать в соотв. директорию.
Для .so - библиотеки получился такой makefile:
Скрытый текст

    #
    # file makefile 2018.04.07
    #
    # Все файлы проекта в нескольких директориях
    # Все файлы в каждой директории - файлы проекта
    #
    #
    #-------------------------------------------------------
    # Compiler name
    #
    CC := g++
    #-------------------------------------------------------
    # Result
    #
    PNAME := boostintdll.so
    #-------------------------------------------------------
    # Модули c интерфейсными функциями dll
    #
    #DLLINTERFACE := dllmod1 dllmod2
    DLLINTERFACE := boostintmod
    #-------------------------------------------------------
    # mkf name - сделаем сборку зависимой от изменения
    # и .mkf-файла тоже
    #
    MN := makefile
    #-------------------------------------------------------
    # директории для поиска файлов
    #
    source_dir1 := .
    source_dir2 := ../gen
    source_dir2p := ../gen/
    source_dir3 := ../boost
    source_dir3p := ../boost/
    source_dirs := $(source_dir1) $(source_dir2) $(source_dir3)
    # поиск хеадеров (сначала в своей директории):
    search_h1 := $(source_dir1) $(source_dir2) $(source_dir3)
    search_h2 := $(source_dir2)
    search_h3 := $(source_dir3) $(source_dir2)
    #
    search_sources := $(addsuffix /*.cpp,$(source_dirs))
    search_dir1 := $(addsuffix /*.cpp,$(source_dir1))
    search_dir2 := $(addsuffix /*.cpp,$(source_dir2))
    search_dir3 := $(addsuffix /*.cpp,$(source_dir3))
    #-------------------------------------------------------
    # LIBs
    #
    LIBS := -lpthread -lrt -nostdlib
    LIBPRJ := libut.a
    LIBG := $(addsuffix /libg.a,$(source_dir2))
    LIBI := $(addsuffix /libb.a,$(source_dir3))
    #-------------------------------------------------------
    # Опции компилера
    #
    CFLAGS := -Wall -W -Werror -pipe -O2 -fexceptions --static -c -MMD -fPIC
    #-------------------------------------------------------
    # Опции линкера
    #
    LFLAGS := -Wall -pipe -L/usr/lib -L/usr/lib/nptl -D_REENTRANT -s -shared
    #-------------------------------------------------------
    # общая цель - состоит в данном случае из 3-х целей
    # 1. статическая библиотека $(LIBG)
    # 2. статическая библиотека $(LIBI)
    # 3. программа $(PNAME) с использованием этих библиотек
    #
    .PHONY : all
    all: $(LIBG) $(LIBI) $(PNAME)
    #-------------------------------------------------------
    # библиотеку $(LIBG) сделаем из файлов в директории
    # $(source_dir2)
    #
    $(LIBG): $(MN)
    $(LIBG): $(patsubst %.cpp,%.o,$(wildcard $(search_dir2)))
    VPATH := $(source_dir2)
    $(addprefix $(source_dir2p),%.o): $(addprefix $(source_dir2p),%.cpp) $(MN)
    $(CC) $(CFLAGS) $(addprefix -I ,$(search_h2)) $< -o $@
    ar cr $(LIBG) $@
    #-------------------------------------------------------
    include $(wildcard $(addprefix $(source_dir2p),*.d))
    #-------------------------------------------------------
    # библиотеку $(LIBI) сделаем из файлов в директории
    # $(source_dir3)
    #
    $(LIBI): $(MN)
    $(LIBI): $(patsubst %.cpp,%.o,$(wildcard $(search_dir3)))
    VPATH := $(source_dir3)
    $(addprefix $(source_dir3p),%.o): $(addprefix $(source_dir3p),%.cpp) $(MN)
    $(CC) $(CFLAGS) $(addprefix -I ,$(search_h3)) $< -o $@
    ar cr $(LIBI) $@
    #-------------------------------------------------------
    include $(wildcard $(addprefix $(source_dir3p),*.d))
    #-------------------------------------------------------
    #-------------------------------------------------------
    # $< - 1 param, $^ - all params, $@ - target
    # запуск линкера - собираем результат из библиотек и .o файлов
    #
    $(PNAME): $(LIBG)
    $(PNAME): $(LIBI)
    $(PNAME): $(LIBPRJ)
    $(PNAME): $(MN)
    $(PNAME): $(notdir $(patsubst %.cpp,%.o,$(wildcard $(search_sources))))
    $(CC) $(LFLAGS) $(addsuffix .o,$(DLLINTERFACE)) $(LIBPRJ) $(LIBI) $(LIBG) $(LIBS) -o $@
    #-------------------------------------------------------
    # установим путь для поиска файлов
    #
    VPATH := $(source_dir1) : $(source_dir2) : $(source_dir3)
    %.o: %.cpp $(MN)
    $(CC) $(CFLAGS) $(addprefix -I ,$(source_dirs)) $<
    #.......................................................
    # укажем зависимости, сгенерированне компилером
    #
    include $(wildcard *.d)
    #.......................................................
    # внесём все .o файлы директории $(source_dir1) в библиотеку проекта $(LIBPRJ)
    #
    $(LIBPRJ): $(notdir $(patsubst %.cpp,%.o,$(wildcard $(search_dir1))))
    ar cr $@ *.o
    #-------------------------------------------------------
    #
    .PHONY : clean
    clean:
    rm -f *.o *.d
    #-------------------------------------------------------


Ты уж сам смотри, что тебе нужно.
Можно собрать статическую библиотеку С отдельно, и просто подключить её при сборке
c++ проекта, передав линкеру в качестве параметра.

https://forum.sources.ru/index.php?showtopic=419682&view=findpost&p=3839014

Метки:  

 

Добавить комментарий:
Текст комментария: смайлики

Проверка орфографии: (найти ошибки)

Прикрепить картинку:

 Переводить URL в ссылку
 Подписаться на комментарии
 Подписать картинку