Автоматически: -экспорт-символы с check_PROGRAMS - PullRequest
0 голосов
/ 29 апреля 2019

При использовании -export-symbols или -export-symbols-regex для ограничения общедоступного интерфейса библиотеки, как неэкспортированные символы могут быть проверены модулем?

Например, вот небольшая библиотека с экспортированной и неэкспортированной функцией, а также тестовая программа:

/* hello.h */

int hello__unexported(int a, int b);
int hello_exported(int a, int b);

/* hello.c */

int hello__unexported(int a, int b) {
    return a * b;
}

int hello_exported(int a, int b) {
    return a + b + hello__unexported(a, b);
}

/* tests/hello_test.c */

#include <assert.h>

#include "hello.h"

int main(int argc, char **argv) {

    assert(6 == hello__unexported(2, 3));
    assert(11 == hello_exported(2, 3));

    return 0;
}

Вот файл automake для сборки библиотеки и

# Makefile.am

lib_LTLIBRARIES = libhello.la
libhello_la_SOURCES = hello.c
libhello_la_LDFLAGS = -export-symbols-regex '^hello_[^_]'

TESTS = $(check_PROGRAMS)
check_PROGRAMS = tests/hello_test
tests_hello_test_SOURCES = tests/hello_test.c
tests_hello_test_LDADD = libhello.la

Однако неэкспортированные символы не могут быть связаны с тестовой программой. Вот make check:

libtool: link: gcc -g -O2 -o tests/.libs/hello_test tests/hello_test-hello_test.o  ./.libs/libhello.dylib
Undefined symbols for architecture x86_64:
  "_hello__unexported", referenced from:
      _main in hello_test-hello_test.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[1]: *** [tests/hello_test] Error 1
make: *** [check-am] Error 2

Кроме добавления второй цели lib_LTLIBRARIES, идентичной первой, но пропуска -export-symbols-regex из _la_LDFLAGS, есть ли способ ограничить только символы экспорта во время распространения, а не тестировать?

...