Я работаю над своей собственной общей библиотекой, которая сильно зависит от 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