CMAKE Связывает динамическую библиотеку с модулем, но не отображается как зависимость ссылки

Направь меня в правильном направлении, если об этом уже спрашивали. У меня есть lib1 и mod2, которые должны быть связаны друг с другом. Этот проект распространяется на пару папок и пару CMakeLists.txt файлы. cmake Команды, которые я использую, таковы:

cmake file 1 (базовый каталог):

# Set C/C++ compile and linking flags
set(GCC_COVERAGE_COMPILE_FLAGS "-fpic -Wno-as-needed")

set(GXX_COVERAGE_COMPILE_FLAGS "-std=c++11")

set(GXX_COVERAGE_LINK_FLAGS "-Wl,--no-undefined -Wno-as-needed")

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${GCC_COVERAGE_COMPILE_FLAGS} ${GXX_COVERAGE_COMPILE_FLAGS}")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${GCC_COVERAGE_COMPILE_FLAGS}")
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER__FLAGS} ${GCC_COVERAGE_LINK_FLAGS}")

cmake file 2 (lib1 dir):

pybind11_add_module(elka_comm__common
SHARED
pyelka_common.cpp
elka.cpp
elka_comm.cpp
)

set_target_properties(elka_comm__common PROPERTIES
LIBRARY_OUTPUT_DIRECTORY ${ELKA_BINARY_DIR}/python
)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${GCC_COVERAGE_COMPILE_FLAGS} ${GXX_COVERAGE_COMPILE_FLAGS}")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${GCC_COVERAGE_COMPILE_FLAGS}")
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER__FLAGS} ${GCC_COVERAGE_LINK_FLAGS}")

add_dependencies(elka_comm__common msg_gen)

cmake file 3 (mod2 dir):

#FIXME ldd not showing elka_comm__common as a link dependency
#            -> CommPort undefined symbol upon module import
target_link_libraries(
elka_comm__gnd_station
PUBLIC
elka_comm__common
)

set_target_properties(elka_comm__gnd_station PROPERTIES
LIBRARY_OUTPUT_DIRECTORY ${ELKA_BINARY_DIR}/python
)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${GCC_COVERAGE_COMPILE_FLAGS} ${GXX_COVERAGE_COMPILE_FLAGS}")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${GCC_COVERAGE_COMPILE_FLAGS}")
set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER__FLAGS} ${GCC_COVERAGE_LINK_FLAGS}")

add_dependencies(elka_comm__gnd_station
elka_comm__common
msg_gen
)

Некоторые из моих шагов являются избыточными для проверки работоспособности (например, установка флагов с переменными CMAKE).

Ниже приведен частичный вывод ldd -r <path-to-mod2.so>/mod2.so:

    linux-vdso.so.1 =>  (0x00007fff777fe000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fadfe690000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fadfe479000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fadfe0b0000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fadfddaa000)
/lib64/ld-linux-x86-64.so.2 (0x000055f1e6b2c000)
undefined symbol: _ZTIN4elka8CommPortE  (build_elka_data_collection/python/elka_comm__gnd_station.so)

lib1 называется elka_comm__common.soи поэтому он должен отображаться как зависимость библиотеки в ldd, право?

Частичный вывод cmake/make команды:

[100%] Linking CXX shared module ../../../python/elka_comm__gnd_station.so
cd /home/Programs/elka/elka_data_collection/build_elka_data_collection/src/elka_comm/gnd_station && /opt/cmake-3.4.3-Linux-x86_64/bin/cmake -E cmake_link_script CMakeFiles/elka_comm__gnd_station.dir/link.txt --verbose=1
/usr/bin/c++  -fPIC  -fpic -Wno-as-needed -std=c++11 -fpic -Wno-as-needed -std=c++11 -g   -shared  -o ../../../python/elka_comm__gnd_station.so CMakeFiles/elka_comm__gnd_station.dir/pyelka_gnd_station.cpp.o CMakeFiles/elka_comm__gnd_station.dir/elka_devices.cpp.o `CMakeFiles/elka_comm__gnd_station.dir/inet_comm.cpp.o  -L/home/Programs/elka/elka_data_collection/build_elka_data_collection/src/elka_comm/common  -L/home/Programs/elka/elka_data_collection/build_elka_data_collection/src/elka_comm/gnd_station  -L/home/Programs/elka/elka_data_collection/build_elka_data_collection/python  -L/home/Programs/elka/elka_data_collection/python ../../../python/elka_comm__common.so -Wl,-rpath,/home/Programs/elka/elka_data_collection/build_elka_data_collection/src/elka_comm/common:/home/Programs/elka/elka_data_collection/build_elka_data_collection/src/elka_comm/gnd_station:/home/Programs/elka/elka_data_collection/build_elka_data_collection/python:/home/Programs/elka/elka_data_collection/python`

Исходя из этого, мне кажется, что связывание сделано правильно. Моя лучшая интуиция заключается в том, что порядок в cmake сгенерированная команда ссылки неверна, но я не могу оправдать это, кроме того, что знаю, что команды ссылки относятся к порядку.

0

Решение

Решено добавлением -Wl,--no-as-needed в CMAKE_CXX_FLAGS, Помните, что добавление к CMAKE_SHARED_LINKER_FLAGS|CMAKE_MODULE_LINKER_FLAGS не работает и не добавляет -Wno-as-needed в CMAKE_CXX_FLAGS,

Другие проблемы сохраняются, хотя. Если у кого-то есть опыт w / привязки кода C ++ к python, пишите мне.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]