C сборка проекта с мезонами: правильный способ обработки сторонних локальных библиотек - PullRequest
0 голосов
/ 28 марта 2020

Я хотел создать проект, использующий библиотеку тестирования Criterion , и я использую мезон для его создания. Я могу создать свой собственный код, библиотеку stati c, которая использует только стандартные библиотеки c. Модульные тесты основаны на #include <criterion/criterion.h>. Если я попытаюсь загрузить бинарный архив и включить его в файл meson.build, я не смогу успешно собрать проект. Я полагаю, что не правильно закрепляю мезон. Я новичок в Мезон, так что я не уверен, в чем дело. Я ошибаюсь.

meson.build ,

project('is_substring', 'c')

static_library(
    'is_substring',
    'is_substring.h',
)

executable(
    'test_is_substring',
    'is_substring.test.c',
    include_directories: include_directories(
        'libs/criterion-v2.3.3',
    ),
    #dependencies: [
    #    dependency('criterion')
    #]
)

Структура проекта ,


  ▸ builddir/
  ▸ libs/criterion-v2.3.3/
    is_substring.h
    is_substring.test.c
    meson.build

и двоичный архив Criterion tar.bz2 извлечен в ./libs,

  ▾ libs/criterion-v2.3.3/
    ▾ include/criterion/
      ▸ internal/
        abort.h
        alloc.h
        assert.h
        criterion.h
        event.h
        hooks.h
        logging.h
        options.h
        output.h
        parameterized.h
        redirect.h
        stats.h
        theories.h
        types.h
    ▾ lib/
        libcriterion.so
        libcriterion.so.3
        libcriterion.so.3.1.0
    ▾ share/pkgconfig/
        criterion.pc

is_substring.test. c,

#include "criterion/criterion.h"
#include <stdbool.h>
#include <stdio.h>

#include "is_substring.h"


Test(is_substring, is_substring)
{
    cr_assert(is_substring("aaa", "a") == true);
}

is_substring.h ,

#include "stdbool.h"

bool is_substring(const char *fullstr, const char *substr)
{
    return true;
}

Ошибка при попытке построить:

francium@4ab5198f934f:/mnt/c/brute-force/builddir$ ninja
[1/2] Compiling C object 'test_is_substring@exe/is_substring.test.c.o'.
FAILED: test_is_substring@exe/is_substring.test.c.o
cc -Itest_is_substring@exe -I. -I.. -I../libs/criterion-v2.3.3 -fdiagnostics-color=always -pipe -D_FILE_OFFSET_BITS=64 -Wall -Winvalid-pch -g -MD -MQ 'test_is_substring@exe/is_substring.test.c.o' -MF 'test_is_substring@exe/is_substring.test.c.o.d' -o 'test_is_substring@exe/is_substring.test.c.o' -c ../is_substring.test.c
../is_substring.test.c:1:10: fatal error: criterion/criterion.h: No such file or directory
 #include <criterion/criterion.h>
          ^~~~~~~~~~~~~~~~~~~~~~~
compilation terminated.
ninja: build stopped: subcommand failed.
francium@4ab5198f934f:/mnt/c/brute-force/builddir$

Как указано @jonathan -leffler в комментариях, эта команда g cc работает, правильно компилирует и связывает,

gcc -o is_substring.test is_substring.test.c -I libs/criterion-v2.3.3/include/ -Llibs/criterion-v2.3.3/lib -lcriterion

1 Ответ

0 голосов
/ 29 марта 2020

Удалось заставить его скомпилироваться, но поскольку библиотека Criterion является общей библиотекой и не установлена ​​глобально, она не будет работать, если вы просто попытаетесь запустить скомпилированный тестовый исполняемый файл.

Но исправление для компиляции добавляем в

executable(
    ...
    objects: [
        'libs/criterion-v2.3.3/lib/libcriterion.so',
    ]

Обратите внимание, что путь include_directories также должен быть 'libs/criterion-v2.3.3/include/' с include/ в конце.

Полный meson.build ,

project('is_substring', 'c')

static_library(
    'is_substring',
    'is_substring.h',
)

include_criterion = include_directories(
    'libs/criterion-v2.3.3/include/',
)

executable(
    'test_is_substring',
    'is_substring.test.c',
    include_directories: [
        include_criterion,
    ],
    objects: [
        'libs/criterion-v2.3.3/lib/libcriterion.so',
    ]
)

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

./test_is_substring: error while loading shared libraries: libcriterion.so.3: cannot open shared object file: No such file or directory

Как предположил Джонатан, исправлено для этого:

Вам может потребоваться указать -R / opt / criterion-v2.3.3 / lib или -R / usr / local / lib, если вы установите библиотеку Criterion в одно из этих мест. Или это может быть ошибочно воспринято из Solaris и не относится к Linux. В любом случае система может выглядеть в / usr / local / lib. Там также LD_LIBRARY_PATH; Вы можете добавить /home/you/project/libs/criterion-v2.3.3/lib (или около того) к вашей переменной среды LD_LIBRARY_PATH, и это должно позволить ее подбирать до тех пор, пока она не будет официально установлена ​​

Спасибо @ Джонатану Леффлеру за помощь и понимание.

...