Я пересмотрел 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])