代码之家  ›  专栏  ›  技术社区  ›  user1122069

CMake在Linux(Ubuntu)和OS X上使用“target\u include\u目录”的方式不同

  •  0
  • user1122069  · 技术社区  · 8 年前

    我有一个多目标CMake文件,其中所有目标都在OS X上构建良好,但当我在Ubuntu Linux上构建目标时,它没有链接添加到target\u include\u目录中的系统库。

    下面是一个目标示例(每个目标都类似)。

    set(SOURCE_FILES_TARGET)
    set(RELEASE_LIBS iconv m xml2 z icucore resolv curl )
    add_executable(TARGET_NAME ${SOURCE_FILES_TARGET)
    target_include_directories(TARGET_NAME PRIVATE external_lib1/headers external_lib2/headers )
    target_link_libraries(TARGET_NAME ${RELEASE_LIBS})
    target_link_libraries(TARGET_NAME ${CMAKE_SOURCE_DIR}/lib1.a)
    target_link_libraries(TARGET_NAME ${CMAKE_SOURCE_DIR}/lib2.a)
    

    linux的库有点不同(与.la文件相比),但即使是相同的库(xml2)也会导致未定义的引用错误。此外,在OS X上,“target\u link\u libraries”命令的工作方式如上所示,并且采用-lxml2格式。

    我试图在linux上添加“pthreads”库(正如它所要求的那样,但在OS X上没有),唯一能够添加它的方法是

    set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -pthread")
    

    然而,这是所有目标的全球设置。基本上,如果我将pthread放入target\u link\u库,它就会被忽略,就像其他库一样。

    如何最好地将这些库添加到目标?也许我在苹果操作系统方面遗漏了一些东西,而它恰好起作用?

    1 回复  |  直到 8 年前
        1
  •  1
  •   piwi    8 年前

    不确定你的问题到底是什么,但这里有一些提示可能会帮助你。

    与其设置库名称并告诉程序根据它们进行编译,不如尝试使用 find_library() 并将程序与CMake命令产生的变量相链接。这样,如果没有找到库,CMake实际上可能会告诉您。

    find_library(XML2_LIBRARY xml2)
    add_executable(TARGET_NAME ${XML2_LIBRARY})
    

    这样,您可以提供几个可能的库名称(例如,名称可能会因编译系统而异)。此外,您可以告诉CMake查看其他目录(例如。 CMAKE_LIBRARY_PATH )不改变你的 CMakeLists.txt .

    您还应该检查是否有为您感兴趣的依赖项提供配置的CMake模块(CMake 3.7有一个 FindLibXml2 模块)。

    对于 pthread ,你应该查一下CMake的 FindThreads .