LINUX.ORG.RU

Cmake линковка с разделяемыми библиотеками


0

3

Сражаюсь уже который день, не могу найти в чем собака порылась и где ошибка. Итак есть софтина, в которой 2 либы и бинарь. 1. libcommon.so - там всякая общая фигня типа платформозависимого кода и имплементации общих класов. 2. libthelib.so - собственно сама суть софта, основная рабочая библиотека, линкуется с libcommon 3. server - собственно бинарь, который линкуется как с первой так и с второй библиотекой.

libcommon собирается, libthelib тоже, но вот когда доходит до линковки бинаря, то libthelib репортит что не может найти символы (которые в libcommon) а затем и server.о матерится что не может слинковаться с libcommon

Вот так выглядит результирующая команда линковки

/usr/bin/c++   -D_FORTIFY_SOURCE=2 -g  -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -Wall -Werror -fPIC -fdata-sections -ffunction-sections -fno-rtti -g -O3 -fvisibility=hidden -fno-strict-aliasing -DSHORT_PATH_IN_LOGGER=45   -Wl,-z,relro CMakeFiles/server.dir/src/server.cpp.o  -o server -rdynamic ../thelib/libthelib.so ../common/libcommon.so -lssl -lcrypto /lib/x86_64-linux-gnu/libdl.so.2 -lrt

★★★★★
Ответ на: комментарий от bhfq

Он большой. Спроси что-то конкретнее...

вот напрмер

readelf -d ../thelib/libthelib.so 

Dynamic section at offset 0x1eacb8 contains 33 entries:
  Tag        Type                         Name/Value
 0x0000000000000001 (NEEDED)             Shared library: [libcommon.so]
 0x0000000000000001 (NEEDED)             Shared library: [libdl.so.2]
 0x0000000000000001 (NEEDED)             Shared library: [libssl.so.1.0.0]
 0x0000000000000001 (NEEDED)             Shared library: [libcrypto.so.1.0.0]
 0x0000000000000001 (NEEDED)             Shared library: [libstdc++.so.6]
 0x0000000000000001 (NEEDED)             Shared library: [libm.so.6]
 0x0000000000000001 (NEEDED)             Shared library: [libgcc_s.so.1]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
 0x000000000000000e (SONAME)             Library soname: [libthelib.so]
 0x000000000000000c (INIT)               0x18ca0
 0x000000000000000d (FINI)               0x18ff18
 0x0000000000000019 (INIT_ARRAY)         0x3e50f0
 0x000000000000001b (INIT_ARRAYSZ)       72 (bytes)
 0x000000000000001a (FINI_ARRAY)         0x3e5138
 0x000000000000001c (FINI_ARRAYSZ)       8 (bytes)
 0x0000000000000004 (HASH)               0x1f0
 0x000000006ffffef5 (GNU_HASH)           0xd80
 0x0000000000000005 (STRTAB)             0x3db8
 0x0000000000000006 (SYMTAB)             0x1148
 0x000000000000000a (STRSZ)              17564 (bytes)
 0x000000000000000b (SYMENT)             24 (bytes)
 0x0000000000000003 (PLTGOT)             0x3eafe8
 0x0000000000000002 (PLTRELSZ)           10488 (bytes)
 0x0000000000000014 (PLTREL)             RELA
 0x0000000000000017 (JMPREL)             0x163a8
 0x0000000000000007 (RELA)               0x8728
 0x0000000000000008 (RELASZ)             56448 (bytes)
 0x0000000000000009 (RELAENT)            24 (bytes)
 0x000000006ffffffe (VERNEED)            0x8608
 0x000000006fffffff (VERNEEDNUM)         6
 0x000000006ffffff0 (VERSYM)             0x8254
 0x000000006ffffff9 (RELACOUNT)          2188
 0x0000000000000000 (NULL)               0x0

Jetty ★★★★★
() автор топика
Ответ на: комментарий от Dron

Или так:

IF(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64" AND NOT MSVC)
        set_source_files_properties(${SOURCES} COMPILE_FLAGS "${CMAKE_STATIC_LIBRARY_C_FLAGS} -fPIC")
ENDIF(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64" AND NOT MSVC) 

CMake жадничает на -fPIC часто, я замечал только на 64 битных системах.

Это мой частный случай, но ТС понял конструкцию.

bhfq ★★★★★
()
Последнее исправление: bhfq (всего исправлений: 1)
Ответ на: комментарий от Jetty

Если дело действительно в PIC, то начиная с CMake 2.9 нужно пользоваться специальным параметром POSITION_INDEPENDENT_CODE.

Dendy ★★★★★
()
Ответ на: комментарий от Jetty

Насколько я понимаю дело не в fPIC а в том что линкер не может найти саму библиотеку... и я не очень понимаю почему, вроде как в команде линковки явно указывается путь к ней

/usr/bin/c++ -D_FORTIFY_SOURCE=2 -g -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -Wall -Werror -fPIC -fdata-sections -ffunction-sections -fno-rtti -g -O3 -fvisibility=hidden -fno-strict-aliasing -DSHORT_PATH_IN_LOGGER=45 -Wl,-z,relro CMakeFiles/crtmpserver.dir/src/crtmpserver.cpp.o -o crtmpserver -rdynamic ../thelib/libthelib.so ../common/libcommon.so -ltinyxml -llua5.1 -lssl -lcrypto /lib/x86_64-linux-gnu/libdl.so.2 -lrt -Wl,-rpath,/usr/lib/crtmpserver

Jetty ★★★★★
() автор топика

Вряд ли поможет, но вдруг...

У меня был проект с несколькими зависимыми so-шками, который не линковался, помогло изменение порядка линковки своих и системных библиотек именно для исполнимого файла (типа, поменять местами 24 и 25 строчки в crtmpserver/CMakeLists.txt), хотя вроде этот порядок влиять не должен на сборку. На stackoverflow было обсуждение этой фичи из разряда «потанцуй с бубном», но я не нашёл сейчас его.

anonymous
()

Проблема разрешилась при помощи Dendy
Причина такого поведения в -fvisibility=hidden
Смена на -fvisibility=default помогла :-)

Jetty ★★★★★
() автор топика
Ответ на: комментарий от Begemoth

Может быть 2.8.9? А то в документации по 2.8.11 он описан.

Точно может ответить только система контроля версий. Это один из проектов, которые стоит обновлять как только, так сразу.

Dendy ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.