При использовании -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
, есть ли способ ограничить только символы экспорта во время распространения, а не тестировать?