AC_SEARCH_LIBS не находит функции в gswteos-10 - PullRequest
1 голос
/ 19 октября 2019

Я пересмотрел gswteos-10 для включения сборки autotools , чтобы упростить его использование в проекте, где во многих других пакетах также используются автоинструменты. Проект кросс-компилируется для arm, но моя проблема также возникает на моем ноутбуке amd64, а также в конвейерах CI / CD с битбакетом . Я свел проблему к довольно простому примеру здесь .

Использование:

AC_SEARCH_LIBS([gsw_z_from_p], [gswteos-10])

Я ожидаю, что ./configure даст:

checking for library containing gsw_z_from_p... -lgswteos-10

но вместо этого я вижу:

checking for library containing gsw_z_from_p... no

Тем временем, я могу получить проект для компиляции, вручную добавив

z_from_p_LDADD = -lgswteos-10 -lm

к Makefile.am, но я бы хотелисправить это правильно способом.

Это может быть что-то простое, что мне не хватает в документации. Я подозреваю, что это связано с тем, как я добавил сборку autotools в библиотеку.

  • После установки gswteos-10 я запустил ldconfig.

  • Я также пытался установить gswteos-10 на /usr вместо /usr/local, но это не помогло. (Это был выстрел в темноте, поскольку у меня /usr/local/lib указано в /etc/ld.so.conf.d/local.conf.)

  • Я подтвердил, что функция gsw_z_from_p существует путем компиляции с руководствомLDADD, и:

nm /usr/local/lib/libgswteos-10.so | grep gsw_z_from_p
0000000000022b40 T gsw_z_from_p

Я пытаюсь настроить его с помощью pkg-config, но, похоже, это должно быть что-то, что autoconf может сделать насвой собственный ...


Вот diff для коммита в моей ветке autotools библиотеки , которая исправила проблему autoconf для моего упрощенного примера (и моего реального приложения):

diff --git a/Makefile.am b/Makefile.am
index eeafcf2..db8eda8 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -11,7 +11,7 @@ pkgconfig_DATA = gswteos-10.pc
 libgswteos_10_la_SOURCES = gsw_oceanographic_toolbox.c gsw_saar.c \
                           gsw_internal_const.h
 libgswteos_10_la_CFLAGS = $(AM_CFLAGS)
-libgswteos_10_la_LDFLAGS = -module -shared -export-dynamic \
+libgswteos_10_la_LDFLAGS = -lm -module -shared -export-dynamic \
                           -version-info 3:5:0

 TESTS = gsw_check_functions

Вот соответствующая часть config.log для тестового приложения до:

configure:3455: checking for library containing gsw_z_from_p
configure:3486: gcc -o conftest -g -O2   conftest.c  >&5
/usr/bin/ld: /tmp/ccGeQnML.o: in function `main':
/home/squall/src/foss/test-gswteos-10/conftest.c:22: undefined reference to `gsw_z_from_p'
collect2: error: ld returned 1 exit status
configure:3486: $? = 1
configure: failed program was:
| /* confdefs.h */
| #define PACKAGE_NAME "test-gswteos-10"
| #define PACKAGE_TARNAME "test-gswteos-10"
| #define PACKAGE_VERSION "dc168980"
| #define PACKAGE_STRING "test-gswteos-10 dc168980"
| #define PACKAGE_BUGREPORT "https://bitbucket.org/bluesquall/test-gsw-teos-10/issues"
| #define PACKAGE_URL "https://bitbucket.org/bluesquall/test-gsw-teos-10"
| #define PACKAGE "test-gswteos-10"
| #define VERSION "dc168980"
| /* end confdefs.h.  */
| 
| /* Override any GCC internal prototype to avoid an error.
|    Use char because int might match the return type of a GCC
|    builtin and then its argument prototype would still apply.  */
| #ifdef __cplusplus
| extern "C"
| #endif
| char gsw_z_from_p ();
| int
| main ()
| {
| return gsw_z_from_p ();
|   ;
|   return 0;
| }
configure:3486: gcc -o conftest -g -O2   conftest.c -lgswteos-10   >&5
/usr/bin/ld: /usr/local/lib/libgswteos-10.so: undefined reference to `atan2'
/usr/bin/ld: /usr/local/lib/libgswteos-10.so: undefined reference to `sin'
/usr/bin/ld: /usr/local/lib/libgswteos-10.so: undefined reference to `exp'
/usr/bin/ld: /usr/local/lib/libgswteos-10.so: undefined reference to `pow'
/usr/bin/ld: /usr/local/lib/libgswteos-10.so: undefined reference to `sqrt'
/usr/bin/ld: /usr/local/lib/libgswteos-10.so: undefined reference to `clog'
collect2: error: ld returned 1 exit status
configure:3486: $? = 1
configure: failed program was:
| /* confdefs.h */
| #define PACKAGE_NAME "test-gswteos-10"
| #define PACKAGE_TARNAME "test-gswteos-10"
| #define PACKAGE_VERSION "dc168980"
| #define PACKAGE_STRING "test-gswteos-10 dc168980"
| #define PACKAGE_BUGREPORT "https://bitbucket.org/bluesquall/test-gsw-teos-10/issues"
| #define PACKAGE_URL "https://bitbucket.org/bluesquall/test-gsw-teos-10"
| #define PACKAGE "test-gswteos-10"
| #define VERSION "dc168980"
| /* end confdefs.h.  */
| 
| /* Override any GCC internal prototype to avoid an error.
|    Use char because int might match the return type of a GCC
|    builtin and then its argument prototype would still apply.  */
| #ifdef __cplusplus
| extern "C"
| #endif
| char gsw_z_from_p ();
| int
| main ()
| {
| return gsw_z_from_p ();
|   ;
|   return 0;
| }
configure:3503: result: no

и после:

configure:3455: checking for library containing gsw_z_from_p
configure:3486: gcc -o conftest -g -O2   conftest.c  >&5
/usr/bin/ld: /tmp/cc5lIEqu.o: in function `main':
/home/squall/src/foss/test-gswteos-10/conftest.c:22: undefined reference to `gsw_z_from_p'
collect2: error: ld returned 1 exit status
configure:3486: $? = 1
configure: failed program was:
| /* confdefs.h */
| #define PACKAGE_NAME "test-gswteos-10"
| #define PACKAGE_TARNAME "test-gswteos-10"
| #define PACKAGE_VERSION "dc168980"
| #define PACKAGE_STRING "test-gswteos-10 dc168980"
| #define PACKAGE_BUGREPORT "https://bitbucket.org/bluesquall/test-gsw-teos-10/issues"
| #define PACKAGE_URL "https://bitbucket.org/bluesquall/test-gsw-teos-10"
| #define PACKAGE "test-gswteos-10"
| #define VERSION "dc168980"
| /* end confdefs.h.  */
| 
| /* Override any GCC internal prototype to avoid an error.
|    Use char because int might match the return type of a GCC
|    builtin and then its argument prototype would still apply.  */
| #ifdef __cplusplus
| extern "C"
| #endif
| char gsw_z_from_p ();
| int
| main ()
| {
| return gsw_z_from_p ();
|   ;
|   return 0;
| }
configure:3486: gcc -o conftest -g -O2   conftest.c -lgswteos-10   >&5
configure:3486: $? = 0
configure:3503: result: -lgswteos-10

После того, как @JohnBollinger подсказал мнеПри просмотре в config.log основная причина была очевидна - программы не могли найти ссылки на такие функции, как atan2.

Добавление -lm в libgswteos_10_la_LDFLAGS исправляет это так, что любая программа, использующаяlibgswteos-10 сможет найти эти символы.

Другое решение (возможно, более строгое) - использовать опциюИонный пятый аргумент:

AC_SEARCH_LIBS([gsw_z_from_p], [gswteos-10], [], [], [m])
...