链接GCC静态/共享库和线程以及-fPIC标志

时间:2018-03-07 00:00:26

标签: c++ gcc pthreads

我正在构建一个共享库(使用某些C ++ 11/14功能的C ++代码),它链接到我自己的静态库并使用线程。这一切都使用CMake。当我链接我的共享库(“gscore”)并尝试链接到我的静态库(“gslicense”)时,我得到了关于pthreads中符号的错误。全文进一步缩小,但简短版本是:

  制作共享对象时不能使用

'__ pthread_key_create';用-fPIC重新编译

我已经尝试了这些建议并将-fPIC添加到我的两个项目的编译时标志中。我已经验证-fPIC是我的编译标志的一部分,但错误仍然存​​在。我不确定我错过了什么。

这是错误。

[ 57%] Linking CXX shared library libgscore.so
/usr/bin/ld: ../gslicense/libgslicense.a(gslicensing.cpp.o): relocation R_X86_64_32 against `__pthread_key_create' can not be used when making a shared object; recompile with -fPIC
../gslicense/libgslicense.a: error adding symbols: Bad value
collect2: error: ld returned 1 exit status
GSCore/CMakeFiles/gscore.dir/build.make:1014: recipe for target 'GSCore/libgscore.so' failed
make[2]: *** [GSCore/libgscore.so] Error 1
CMakeFiles/Makefile2:173: recipe for target 'GSCore/CMakeFiles/gscore.dir/all' failed
make[1]: *** [GSCore/CMakeFiles/gscore.dir/all] Error 2
Makefile:83: recipe for target 'all' failed

以下是我在CMakeLists.txt文件中添加线程到项目的方法

#
# pthread
set(THREADS_PREFER_PTHREAD_FLAG ON)
find_package(Threads REQUIRED)
target_link_libraries(gscore Threads::Threads)

这是使用CMake的Linux代码库端口的所有部分。我对Windows非常熟悉,但在Linux中摸索。我已经尝试搜索我能找到的所有线程,但我仍然不知所措。

知道我缺少什么吗?

0 个答案:

没有答案