Можно ли избежать связывания gsl и openmp каждый раз? - PullRequest
0 голосов
/ 07 марта 2020

Я работаю над своей собственной общей библиотекой, которая сильно зависит от GSL и OpenMP

Конечный пользователь должен иметь возможность импортировать мою библиотеку в код c ++

#include "mylib/mylib.h"

и в идеале скомпилировать его с помощью чего-нибудь простого:

g++ myprog.cpp -lmylib

Теперь, в его нынешнем виде, я должен каждый раз связывать библиотеки GSL и OpenMP

g++ myprog.cpp -lgsl -fopenmp -lmylib

в противном случае я получил следующую ошибку для gsl и отсутствия потоков с OpenMP

g++ -o myprog myprog.cpp -lmlip
/usr/bin/ld: /tmp/ccu7Mpg1.o: undefined reference to symbol 'gsl_vector_subvector'
/usr/local/lib/libgsl.so.25: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status
Makefile:2: recipe for target 'myprog' failed
make: *** [myprog] Error 1

Ниже приведен файл cmake, который я использую

find_package(GSL)
find_package(OpenMP)
add_library(mylib SHARED mylib.cpp)
target_link_libraries(mylib PUBLIC ${GSL_LIBRARIES} OpenMP::OpenMP_CXX)
target_compile_options(mylib PUBLIC -O3 -Wall)
install(TARGETS mylib DESTINATION ${CMAKE_INSTALL_PREFIX}/lib)
install(DIRECTORY . DESTINATION ${CMAKE_INSTALL_PREFIX}/include/mylib FILES_MATCHING PATTERN "*.h")

Может ли mylib каким-либо образом ссылаться на gsl? Обратите внимание, что я довольно новичок в концепции создания и связывания библиотек.

Обновление GSL

Я провел небольшое исследование и создал следующий фрагмент, который решает проблему для связывания GSL.

add_library (GSL_LIB STATIC IMPORTED)
SET_TARGET_PROPERTIES(GSL_LIB PROPERTIES IMPORTED_LOCATION ${GSL_ROOT_DIR}/lib/libgsl.a)

Однако этот подход, похоже, не работает для OpenMP. Любые предложения приветствуются.

/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/7/libgomp.a(team.o): relocation R_X86_64_TPOFF32 against hidden symbol `gomp_tls_data' can not be used when making a shared object
/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/7/libgomp.a(oacc-init.o): relocation R_X86_64_TPOFF32 against hidden symbol `goacc_tls_data' can not be used when making a shared object
/usr/bin/ld: final link failed: Nonrepresentable section on output
collect2: error: ld returned 1 exit status
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...