2013-05-02 105 views
4

我已经搜索了几个小时如何解决这个问题,我试过的一切都没有工作。 我试图静态链接某些库,(libPoco,libmysqlcpp,libmysqlclient,libssl)。cmake忽略静态库链接请求

我正在使用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查找静态库而不是动态库? 我对此有错误吗? 谢谢。

回答

7

看起来你在add_libraryfind_library命令之间有点混淆。 find_library不需要参数STATICIMPORTED

此外,你还没有裹${}CMAKE_LIBRARY_PATHfind_library调用之内,所以你有效地传递的“CMAKE_LIBRARY_PATH” 3条路径,“静态”和“进口”向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() 
+1

感谢您的答复!我做了你所说的,但我仍然从cmake获得相同的输出(显示* .so),并尝试将静态链接链接到动态对象。它似乎仍然忽略了* .a – 2013-05-02 19:05:56

+3

没关系,你是对的,cmake被缓存,删除调试目录并再次尝试,现在它使用* .a。谢谢 ! :) – 2013-05-02 19:12:38

+5

另外,FIY:设置(CMAKE_FIND_LIBRARY_SUFFIXES .a $ {CMAKE_FIND_LIBRARY_SUFFIXES}) – 2013-05-02 19:32:11