我已经搜索了几个小时来解决这个问题,但我尝试的一切都不起作用。 我正在尝试与某些库(libPoco、libmysqlcpp、libmysqlclient、libssl)静态链接。
我正在使用 cmake,虽然我正在定义静态库,但 cmake 只是查找动态库。我知道我的文件系统中的静态存档中有所有必需的库,并且我知道它们在哪里。
set(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH}
/lib
/usr/lib
/usr/lib64
/usr/local/lib
/usr/local/lib64
/usr/lib/x86_64-linux-gnu)
find_library(POCO_NET NAMES libPocoNet.a PATHS CMAKE_LIBRARY_PATH STATIC IMPORTED)
find_library(POCO_UTIL NAMES libPocoUtil.a PATHS CMAKE_LIBRARY_PATH STATIC IMPORTED)
find_library(POCO_XML NAMES libPocoXML.a PATHS CMAKE_LIBRARY_PATH STATIC IMPORTED)
find_library (MYSQL_CLIENT NAMES libmysqlclient.a PATHS CMAKE_LIBRARY_PATH STATIC IMPORTED)
find_library (MYSQL_CPP NAMES libmysqlpp.a PATHS CMAKE_LIBRARY_PATH STATIC IMPORTED)
find_library (LIBSSL NAMES libssl.a PATHS CMAKE_LIBRARY_PATH STATIC IMPORTED)
if (POCO_NET AND POCO_UTIL AND POCO_XML AND MYSQL_CLIENT AND MYSQL_CPP AND LIBSSL)
message(STATUS ${POCO_NET})
message(STATUS ${POCO_UTIL})
message(STATUS ${POCO_XML})
message(STATUS ${MYSQL_CLIENT})
message(STATUS ${MYSQL_CPP})
message(STATUS ${LIBSSL})
target_link_libraries(icarus
PocoNet
PocoUtil
PocoXML
mysqlpp
mysqlclient
ssl)
else ()
message(FATAL_ERROR "FATAL ERROR: missing library")
endif (POCO_NET AND POCO_UTIL AND POCO_XML AND MYSQL_CLIENT AND MYSQL_CPP AND LIBSSL)
但是当我运行cmake ..时,我得到的是:
-- /usr/local/lib/libPocoNet.so
-- /usr/local/lib/libPocoUtil.so
-- /usr/local/lib/libPocoXML.so
-- /usr/lib/x86_64-linux-gnu/libmysqlclient.so
-- /usr/lib/libmysqlpp.so
-- /usr/lib/libssl.so
当我尝试编译时,我得到了 undefined reference ,因为我使用的是 -static 标志。 我在这里缺少什么? 有没有办法强制 cmake 查找静态库而不是动态库? 我在这件事上走错路了吗? 谢谢。
最佳答案
看起来您对 add_library
之间有点困惑和 find_library
命令。 find_library
不接受 STATIC
或 IMPORTED
参数。
此外,您还没有将 CMAKE_LIBRARY_PATH
包装在 find_library
调用中的 ${}
中,因此您实际上传递了 3 个路径“CMAKE_LIBRARY_PATH”、“STATIC”和“IMPORTED”到 CMake 的搜索例程,而不是 ${CMAKE_LIBRARY_PATH}
的预期 6 个路径。
最后,由于 ${CMAKE_LIBRARY_PATH}
已经是 CMake 搜索例程中的第一个调用端口,因此无需将其显式添加到 find_library
命令中。
所以你可以这样做:
set(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH}
/lib
/usr/lib
/usr/lib64
/usr/local/lib
/usr/local/lib64
/usr/lib/x86_64-linux-gnu)
find_library(POCO_NET NAMES libPocoNet.a)
find_library(POCO_UTIL NAMES libPocoUtil.a)
find_library(POCO_XML NAMES libPocoXML.a)
find_library(MYSQL_CLIENT NAMES libmysqlclient.a)
find_library(MYSQL_CPP NAMES libmysqlpp.a)
find_library(LIBSSL NAMES libssl.a PATHS)
if(POCO_NET AND POCO_UTIL AND POCO_XML AND MYSQL_CLIENT AND MYSQL_CPP AND LIBSSL)
message(STATUS ${POCO_NET})
message(STATUS ${POCO_UTIL})
message(STATUS ${POCO_XML})
message(STATUS ${MYSQL_CLIENT})
message(STATUS ${MYSQL_CPP})
message(STATUS ${LIBSSL})
target_link_libraries(icarus
${POCO_NET}
${POCO_UTIL}
${POCO_XML}
${MYSQL_CLIENT}
${MYSQL_CPP}
${LIBSSL})
else()
message(FATAL_ERROR "FATAL ERROR: missing library")
endif()
关于cmake忽略静态库链接请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16344302/