我已经搜索了几个小时如何解决这个问题,我尝试的一切都没有用。 我试图静态链接某些库,(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
当我尝试编译时,由于我使用的是-static标志,因此我得到了未定义的引用。 我在这里错过了什么? 有没有办法强制cmake查找静态库而不是动态库? 我对此有错误吗? 谢谢。
答案 0 :(得分:7)
看起来你在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()