C++ 如何使用cmake将第三方静态库链接到mysql server 8.0(出现错误:使用-fPIC重新编译)

C++ 如何使用cmake将第三方静态库链接到mysql server 8.0(出现错误:使用-fPIC重新编译),c++,mysql,gcc,cmake,C++,Mysql,Gcc,Cmake,我正在使用名为libfstack(其文件名为libfstack.a.1.21)的静态第三方库修改mysql server 8.0源代码(开发源代码树)。但是作为CMake的初学者,我无法正确地将第三方库链接到mysql项目。 如果你有任何想法,请告诉我。谢谢 这是我在执行make后收到的错误消息 [ 67%] Built target clientlib_objlib Scanning dependencies of target clientlib [ 67%] Linking CXX sta

我正在使用名为libfstack(其文件名为libfstack.a.1.21)的静态第三方库修改mysql server 8.0源代码(开发源代码树)。但是作为CMake的初学者,我无法正确地将第三方库链接到mysql项目。 如果你有任何想法,请告诉我。谢谢

这是我在执行
make
后收到的错误消息

[ 67%] Built target clientlib_objlib
Scanning dependencies of target clientlib
[ 67%] Linking CXX static library ../archive_output_directory/libclientlib.a
[ 67%] Built target clientlib
Scanning dependencies of target libmysql
[ 67%] Building C object libmysql/CMakeFiles/libmysql.dir/libmysql_dummy.c.o
[ 67%] Linking CXX shared library ../library_output_directory/libmysqlclient.so
/usr/bin/ld: /usr/local/lib/libfstack/libfstack.a.1.21(libfstack.ro): relocation R_X86_64_TPOFF32 against `pcurthread' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: /usr/local/lib/libfstack/libfstack.a.1.21(ff_dpdk_pcap.o): relocation R_X86_64_TPOFF32 against `seq' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: /usr/local/lib/librte_bus_dpaa.a(dpaa_bus.o): relocation R_X86_64_TPOFF32 against symbol `per_lcore_dpaa_io' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: /usr/local/lib/librte_bus_dpaa.a(bman.o): relocation R_X86_64_TPOFF32 against `per_lcore_bman_affine_portal' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: /usr/local/lib/librte_bus_dpaa.a(bman_driver.o): relocation R_X86_64_TPOFF32 against `bmfd' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: /usr/local/lib/librte_bus_dpaa.a(qman.o): relocation R_X86_64_TPOFF32 against `per_lcore_qman_affine_portal' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: /usr/local/lib/librte_bus_dpaa.a(qman_driver.o): relocation R_X86_64_TPOFF32 against `qmfd' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: /usr/local/lib/librte_bus_fslmc.a(dpaa2_hw_dpio.o): relocation R_X86_64_TPOFF32 against symbol `per_lcore__dpaa2_io' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: /usr/local/lib/librte_bus_vdev.a(vdev.o): relocation R_X86_64_TPOFF32 against `per_lcore__thread_id.5396' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: /usr/local/lib/librte_eal.a(eal_thread.o): relocation R_X86_64_TPOFF32 against `per_lcore__thread_id.8400' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: /usr/local/lib/librte_eal.a(eal_vfio.o): relocation R_X86_64_TPOFF32 against `per_lcore__thread_id.8947' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: /usr/local/lib/librte_eal.a(eal_interrupts.o): relocation R_X86_64_TPOFF32 against `per_lcore__epfd' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: /usr/local/lib/librte_eal.a(eal_common_log.o): relocation R_X86_64_TPOFF32 against `per_lcore_log_cur_msg' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: /usr/local/lib/librte_eal.a(eal_common_errno.o): relocation R_X86_64_TPOFF32 against `per_lcore_retval.4583' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: /usr/local/lib/librte_pmd_dpaa_sec.a(dpaa_sec.o): relocation R_X86_64_TPOFF32 against `dpaa_sec_op_nb' can not be used when making a shared object; recompile with -fPIC
我修改了源代码文件mysql\u socket.h、mysqld.cc和socket\u connection.cc。通过在所有项目文件中搜索这些文件名(特别是在xxx/CmakeLists.txt中),我发现它们只与目标sql_main和vio相关。所以我做了如下的cmake配置修改。 顺便说一下,我将系统环境变量CFLAGS和cxflags设置为“-fPIC-shared”,并使用这些标志构建libstack.a.1.21。 我尽了我所能,但仍然坚持上面提到的错误

下面是我在sql/CMakeLists.txt中添加的配置。 PS:我成功地使用cmake构建了一个简单的helloworld程序,所以我确信这里列出了所有必要的库

set_property(TARGET sql_main PROPERTY POSITION_INDEPENDENT_CODE ON)
set_property(TARGET sql_main PROPERTY BUILD_SHARED_LIBS true)
INCLUDE_DIRECTORIES(/usr/local/include)
INCLUDE_DIRECTORIES(/usr/local/include/dpdk)
TARGET_LINK_LIBRARIES(sql_main /usr/local/lib/libfstack/libfstack.a.1.21)
file(GLOB LIBOTHERS "/usr/local/lib/*.a")
TARGET_LINK_LIBRARIES(sql_main -Wl,--whole-archive ${LIBOTHERST} -Wl,--no-whole-archive)
TARGET_LINK_LIBRARIES(sql_main -lrt)
TARGET_LINK_LIBRARIES(sql_main -lm)
TARGET_LINK_LIBRARIES(sql_main -ldl)
TARGET_LINK_LIBRARIES(sql_main -lcrypto)
TARGET_LINK_LIBRARIES(sql_main -lpthread)
TARGET_LINK_LIBRARIES(sql_main -lnuma)
以下是我在vio/CMakeLists.txt中添加的配置

set_property(TARGET vio PROPERTY POSITION_INDEPENDENT_CODE ON)
set_property(TARGET vio PROPERTY BUILD_SHARED_LIBS true)
INCLUDE_DIRECTORIES(/usr/local/include)
INCLUDE_DIRECTORIES(/usr/local/include/dpdk)
TARGET_LINK_LIBRARIES(vio /usr/local/lib/libfstack/libfstack.a.1.21)
file(GLOB LIBOTHERST "/usr/local/lib/*.a")
TARGET_LINK_LIBRARIES(vio -Wl,--whole-archive ${LIBOTHERST} -Wl,--no-whole-archive)
TARGET_LINK_LIBRARIES(vio -lrt)
TARGET_LINK_LIBRARIES(vio -lm)
TARGET_LINK_LIBRARIES(vio -ldl)
TARGET_LINK_LIBRARIES(vio -lcrypto)
TARGET_LINK_LIBRARIES(vio -lpthread)
TARGET_LINK_LIBRARIES(vio -lnuma)

问题是编译
libfstack
时未启用
-fPIC
,您正试图将其链接到共享库中。您写道,在重新编译
libfstack
时,您将
CFLAGS
cxflags
设置为
-fPIC-shared
,但我怀疑添加的
-shared
导致重新编译只生成库的共享版本,而旧的
libfstack.a.1.21
与以前一样


或者,如果您不想重新编译
libfstack
,则需要确保
mysql服务器
不构建共享库。通常这可以通过使用
-DBUILD\u SHARED\u LIBS=OFF
来实现,但是在您发布的
CMakeLists.txt
中看到
set\u属性(TARGET vio property BUILD\u SHARED\u LIBS true)
,我担心mysql服务器不允许在静态和共享构建之间进行开箱即用的切换。因此,您需要手动更改它。

非常感谢,我删除了-shared标志,静态库可以通过共享库链接。