【问题标题】:cmake ignores static library link requestcmake 忽略静态库链接请求
【发布时间】:2013-05-02 17:36:30
【问题描述】:

我已经搜索了几个小时来解决这个问题,但我尝试的一切都没有奏效。 我正在尝试与某些库(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 查找静态库而不是动态库? 我在这件事上走错了吗? 谢谢。

【问题讨论】:

    标签: cmake static-libraries static-linking


    【解决方案1】:

    您似乎对add_library 和find_library 命令有点困惑。 find_library 不接受 STATIC 或 IMPORTED 的参数。

    此外,您还没有将 ${} 包装在 find_library 调用中,因此您实际上将“CMAKE_LIBRARY_PATH”、“STATIC”和“IMPORTED”的 3 条路径传递给 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 得到相同的输出(显示 *.so)和尝试静态链接到动态对象的链接错误。它似乎仍然忽略了 *.a
    • 没关系,你是对的,cmake 被缓存了,删除了调试目录并再次尝试,它现在使用 *.a。谢谢 ! :)
    • 另外,FIY:set(CMAKE_FIND_LIBRARY_SUFFIXES .a ${CMAKE_FIND_LIBRARY_SUFFIXES})
    • @Alex 是的,我应该提到删除您的 CMakeCache.txt - 抱歉!关于CMAKE_FIND_LIBRARY_SUFFIXES的好点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多