Как экспортировать #defines из общей библиотеки c ++ в приложение - PullRequest
0 голосов
/ 28 февраля 2019

Моя библиотека построена с некоторым включенным #define (например, -DUSE_FOO=1), а также USE_FOO используется в публичном заголовочном файле.Проблема заключается в том, что приложение, использующее библиотеку, включает в себя открытый файл заголовка и, таким образом, USE_FOO появляется в контексте приложения и будет неопределенным в контексте приложения.

Как я могу экспортировать USE_FOO определение для приложения на основе того, является ли оновключен в библиотеку или нет?

например,

include/public/foo.h
lib/libfoo.so   --> foo.cc

in foo.h contain code as  
#if defined (USE_FOO)
#define SIZE 5
#else
#define SIZE 10
#endif

foo.cc
#include "foo.h"
int getSizeFromLib()
{
 return SIZE;
}

libfoo.so исходный файл включает в себя foo.h и собран путем настройки USE_FOO во время компиляции.

Теперь приложение использует библиотеку libfoo, включая public/foo.h, и использует свою собственную конфигурацию сборки для сборки приложения.но проблема в том, что приложение не знает USE_FOO, которое всегда будет неопределенным на стороне приложения.Таким образом, SIZE будет 10 в приложении, но 5 внутри библиотеки

Я хочу, чтобы USE_FOO экспортировался в приложение в зависимости от того, определено ли оно для libfoo.so или нет.Т.е. если libfoo.so построен с USE_FOO=1, приложение также должно видеть USE_FOO=1 и наоборот

Если это невозможно сделать заранее определенным способом, тогда любой прием для решения этой проблемы будет приветствоваться.

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

В мире Linux эта задача решается с помощью инструмента pkgconfig .В основном, в дополнение к двоичным файлам и заголовкам, ваша библиотека также поставляется с файлом .pc, который выглядит как

prefix=/usr/local
exec_prefix=${prefix}
includedir=${prefix}/include
libdir=${exec_prefix}/lib

Name: foo
Description: The foo library
Version: 1.0.0
Cflags: -I${includedir}/foo USE_FOO=1
Libs: -L${libdir} -lfoo

Этот файл устанавливается на /usr/lib/pkgconfig, и клиенты должны запрашивать правильные CFLAGS из него, вызывая pkg-config из Makefile:

CFLAGS = -g -Wall -Wextra $(pkg-config --cflags)

Для получения более подробной информации, ознакомьтесь с guide .

Единственное портативное решение - добавить автоматически сгенерированный заголовок foo-config.h, который будет включен во все публичные заголовки библиотеки и определит все специфичные для версии определения (например, USE_FOO).Это, конечно, будет работать только в исходных файлах, которые на самом деле содержат заголовки библиотек.

0 голосов
/ 28 февраля 2019

Нет способа «экспортировать» определение препроцессора из библиотеки в приложение.Оба должны быть скомпилированы с совместимыми флагами, например:

CFLAGS=-DUSE_FOO=1
gcc $CFLAGS --shared -o lib/libfoo.so foo.cc
gcc $CFLAGS lib/libfoo.so app.c
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...