cmake忽略静态库链接请求

标签 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)

但是当我运行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 不接受 STATICIMPORTED 参数。

此外,您还没有将 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/

相关文章:

.net - 如何链接 .NET Core 独立部署?

c++ - 错误 C1083 无法打开包含文件 : 'pybind11/pybind11.h' : No such file or directory

c++ - 使用 cmake 在项目中链接 Opencv

static-libraries - 如何在 Linux 上列出静态库的所有外部 undefined symbol ?

c - 将共享库链接到静态库 : must the static library be compiled differently than if an application were linking it?

c++ - poco c++ 静态链接问题与 undefined symbol 引用

linux - 从centos卸载cmake,用yum安装

macos - 如何在 CMake 脚本中获取应用程序包的路径以将其提供给 fixup_bundle()?

ios - 包括第三方库(示例 : AFNetworking) in static library

static-linking - 如何使用pkg-config静态链接库