[英]Cmake Error undefined reference when linking cxx executable
In my C++ Cmake project, i recently had to include mariadb c++ connector.在我的 C++ Cmake 项目中,我最近不得不包含 mariadb C++ 连接器。 (i'm a cmake beginner). (我是 cmake 初学者)。
Idea is to create and install my own libraries (eg: libnt) depending on this mariadb connector and use them into another program.想法是根据这个 mariadb 连接器创建和安装我自己的库(例如:libnt)并将它们用于另一个程序。
So i've made a main.cpp at the root in order to test it.所以我在根目录创建了一个main.cpp来测试它。
The project structure is as follow :项目结构如下:
--Libnt (root)
|
--- build
|
--- nt
| |
| --- include
| | |
| | --- nt
| | |---log.h
| | |---dcs.h
| | |---db.h
| |
| --- src
| | |---log.cpp
| | |---dcs.cpp
| | |---db.cpp
| |
| --- thirdparty
| | |-- restc-cpp
| |
| --- CMakeLists.txt
|
|--- CmakeLists.txt
|--- main.cpp
I did the mariadb installation as per the documentation我按照文档进行了 mariadb 安装
When cmake.. && make
, i do have the following error and i don't really know how to deal with it.当cmake.. && make
,我确实有以下错误,我真的不知道如何处理它。
[100%] Linking CXX executable trylib
/usr/bin/ld : avertissement : libmariadb.so.3, requis par /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so, non trouvé (essayez avec -rpath ou -rpath-link)
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_fetch_field_direct@libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_stmt_num_rows@libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_reset_connection@libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_fetch_lengths@libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_close@libmysqlclient_18 »
Can someone please help me on this ?有人可以帮我吗?
Regards,问候,
CMakeLists.txt (root) CMakeLists.txt(根)
cmake_minimum_required(VERSION 3.0.0)
project(Calculator_Project VERSION 1.0.0)
set (CMAKE_CXX_STANDARD 14)
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
add_subdirectory(my_math)
add_subdirectory(my_print)
add_subdirectory(nt)
add_executable(trylib main.cpp)
target_link_libraries(trylib PRIVATE my_math my_print nt)
message("CMAKE_INSTALL_PREFIX = ${CMAKE_INSTALL_PREFIX}")
CMakeLists.txt CMakeLists.txt
set (CMAKE_CXX_STANDARD 14)
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
find_package(GTest REQUIRED)
include_directories(${GTEST_INCLUDE_DIRS})
message(${CMAKE_CURRENT_LIST_DIR}/thirdparty/restc-cpp/include)
include_directories(${CMAKE_CURRENT_LIST_DIR}/thirdparty/restc-cpp/include)
set(Boost_USE_STATIC_LIBS ON) # only find static libs
set(Boost_USE_DEBUG_LIBS OFF) # ignore debug libs and
set(Boost_USE_RELEASE_LIBS ON) # only find release libs
set(Boost_USE_MULTITHREADED ON)
set(Boost_USE_STATIC_RUNTIME OFF)
find_package(Boost 1.71.0 COMPONENTS system iostreams asio program_options filesystem date_time context coroutine coroutines chrono log)
if(Boost_FOUND)
include_directories(${Boost_INCLUDE_DIRS})
endif()
find_package(Threads REQUIRED)
find_library(restc-cpp_location NAMES libnamespacetest.a librestc-cpp.a)
message(STATUS ${restc-cpp_location0})
add_library(restc-cpp STATIC IMPORTED)
set_target_properties(restc-cpp PROPERTIES IMPORTED_LOCATION ${restc-cpp_location})
#[[
LIBNT
]]#
add_library(nt src/log.cpp src/dcs.cpp src/db.cpp)
target_link_libraries(nt PRIVATE Threads::Threads restc-cpp mariadbcpp ssl crypto z boost_iostreams boost_log ${Boost_LIBRARIES})
target_include_directories( nt PUBLIC
$<INSTALL_INTERFACE:include>
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
)
install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/nt/log.h
${CMAKE_CURRENT_SOURCE_DIR}/include/nt/dcs.h
${CMAKE_CURRENT_SOURCE_DIR}/include/nt/db.h
DESTINATION ${CMAKE_INSTALL_PREFIX}/include/nt)
install(TARGETS nt EXPORT my_export DESTINATION ${CMAKE_INSTALL_PREFIX}/lib/nt)
install(EXPORT my_export FILE nt-config.cmake DESTINATION ${CMAKE_INSTALL_PREFIX}/lib/nt)
Here is the complete trace :这是完整的跟踪:
-- The C compiler identification is GNU 9.3.0
-- The CXX compiler identification is GNU 9.3.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /usr/bin/cc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Found GTest: /usr/lib/x86_64-linux-gnu/libgtest.a
/home/pierre/Documents/Git/Libnt/nt/thirdparty/restc-cpp/include
-- Could NOT find Boost: missing: asio coroutines (found /usr/local/lib/cmake/Boost-1.77.0/BoostConfig.cmake (found suitable version "1.77.0", minimum required is "1.71.0"))
-- Found Threads: TRUE
--
CMAKE_INSTALL_PREFIX = /usr/local
-- Configuring done
-- Generating done
-- Build files have been written to: /home/pierre/Documents/Git/Libnt/build
[ 9%] Building CXX object nt/CMakeFiles/nt.dir/src/log.cpp.o
[ 18%] Building CXX object nt/CMakeFiles/nt.dir/src/dcs.cpp.o
[ 27%] Building CXX object nt/CMakeFiles/nt.dir/src/db.cpp.o
[ 36%] Linking CXX static library libnt.a
[ 36%] Built target nt
[ 45%] Building CXX object my_print/CMakeFiles/my_print.dir/src/print_result.cpp.o
[ 54%] Linking CXX static library libmy_print.a
[ 54%] Built target my_print
[ 63%] Building CXX object my_math/CMakeFiles/my_math.dir/src/addition.cpp.o
[ 72%] Building CXX object my_math/CMakeFiles/my_math.dir/src/division.cpp.o
[ 81%] Linking CXX static library libmy_math.a
[ 81%] Built target my_math
[ 90%] Building CXX object CMakeFiles/trylib.dir/main.cpp.o
/home/pierre/Documents/Git/Libnt/main.cpp:10:6: warning: ISO C++ forbids declaration of ‘main’ with no type [-Wreturn-type]
10 | main(){
| ^
[100%] Linking CXX executable trylib
/usr/bin/ld : avertissement : libmariadb.so.3, requis par /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so, non trouvé (essayez avec -rpath ou -rpath-link)
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_fetch_field_direct@libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_stmt_num_rows@libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_reset_connection@libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_fetch_lengths@libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_close@libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_field_count@libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_error@libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_stmt_send_long_data@libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_stmt_store_result@libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_select_db@libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_stmt_error@libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_next_result@libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mariadb_get_infov@libmariadb_3 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_stmt_sqlstate@libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_real_connect@libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_get_server_info@libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_stmt_insert_id@libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_fetch_row@libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_init@libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_stmt_next_result@libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_fetch_field@libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_data_seek@libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_thread_id@libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mariadb_get_charset_by_nr@libmariadb_3 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_stmt_execute@libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_session_track_get_first@libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_stmt_init@libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_warning_count@libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_stmt_param_count@libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_insert_id@libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_ping@libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_errno@libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_stmt_data_seek@libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_optionsv@libmariadb_3 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_stmt_close@libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_get_socket@libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_use_result@libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_free_result@libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_stmt_field_count@libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_store_result@libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_stmt_errno@libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_stmt_bind_result@libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_stmt_warning_count@libmariadb_3 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_stmt_bind_param@libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_sqlstate@libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_stmt_attr_set@libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_real_query@libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_stmt_prepare@libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mariadb_reconnect@libmariadb_3 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_affected_rows@libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_stmt_result_metadata@libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_stmt_fetch@libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_num_rows@libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_stmt_affected_rows@libmysqlclient_18 »
collect2: error: ld returned 1 exit status
make[2]: *** [CMakeFiles/trylib.dir/build.make:113 : trylib] Erreur 1
make[1]: *** [CMakeFiles/Makefile2:138 : CMakeFiles/trylib.dir/all] Erreur 2
make: *** [Makefile:136 : all] Erreur 2
Thank you nayab and Tsyvarev .谢谢纳亚布和齐瓦列夫。 Everything is now working !现在一切正常! Sorry for my lack of experience.抱歉我经验不足。
After a ldd libmariadbcpp.so
, i had在ldd libmariadbcpp.so
,我有
linux-vdso.so.1 (0x00007ffe609ca000)
libmariadb.so.3 => not found
libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f866ec91000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f866ec76000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f866ea84000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f866e935000)
/lib64/ld-linux-x86-64.so.2 (0x00007f866f02e000)
I had to do an sudo apt install libmariadb-dev
, ldd command became我不得不做一个sudo apt install libmariadb-dev
, ldd 命令变成
~/Documents/Git/Libnt/nt/thirdparty/mariadb-connector-cpp-1.0.1-ubuntu-focal-amd64/lib64/mariadb$ ldd libmariadbcpp.so
linux-vdso.so.1 (0x00007ffda61d1000)
libmariadb.so.3 => /lib/x86_64-linux-gnu/libmariadb.so.3 (0x00007f326f47d000)
libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f326f29b000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f326f280000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f326f08e000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f326f088000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f326f065000)
libgnutls.so.30 => /lib/x86_64-linux-gnu/libgnutls.so.30 (0x00007f326ee8d000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f326ee71000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f326ed22000)
/lib64/ld-linux-x86-64.so.2 (0x00007f326f68f000)
libp11-kit.so.0 => /lib/x86_64-linux-gnu/libp11-kit.so.0 (0x00007f326ebec000)
libidn2.so.0 => /lib/x86_64-linux-gnu/libidn2.so.0 (0x00007f326ebcb000)
libunistring.so.2 => /lib/x86_64-linux-gnu/libunistring.so.2 (0x00007f326ea49000)
libtasn1.so.6 => /lib/x86_64-linux-gnu/libtasn1.so.6 (0x00007f326ea31000)
libnettle.so.7 => /lib/x86_64-linux-gnu/libnettle.so.7 (0x00007f326e9f7000)
libhogweed.so.5 => /lib/x86_64-linux-gnu/libhogweed.so.5 (0x00007f326e9c0000)
libgmp.so.10 => /lib/x86_64-linux-gnu/libgmp.so.10 (0x00007f326e93c000)
libffi.so.7 => /lib/x86_64-linux-gnu/libffi.so.7 (0x00007f326e930000)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.