cmake忽略静态库链接请求

Æle*_*lex 4 cmake static-libraries static-linking

我已经搜索了几个小时如何解决这个问题,我尝试的一切都没有用.我试图静态链接某些库,(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)
Run Code Online (Sandbox Code Playgroud)

但是当我运行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
Run Code Online (Sandbox Code Playgroud)

当我尝试编译时,我得到未定义的引用,因为我使用的是-static标志.我在这里错过了什么?有没有办法强制cmake查找静态库而不是动态库?我对此有错误吗?谢谢.

Fra*_*ser 7

看起来你add_libraryfind_library命令之间有点混淆. find_library不接受STATIC或的论据IMPORTED.

此外,你没有包含CMAKE_LIBRARY_PATH${}你的find_library通话中,所以你有效地将3个路径的"CMAKE_LIBRARY_PATH","STATIC"和"IMPORTED"传递给CMake的搜索例程,而不是预期的6个路径${CMAKE_LIBRARY_PATH}.

最后,由于${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()
Run Code Online (Sandbox Code Playgroud)

  • 另外,FIY:set(CMAKE_FIND_LIBRARY_SUFFIXES .a $ {CMAKE_FIND_LIBRARY_SUFFIXES}) (5认同)
  • 没关系,你是对的,cmake被缓存,删除调试目录并再次尝试,它现在使用*.a.谢谢 !:) (3认同)