【问题标题】:CMake uses "target_include_directories" differently on Linux (Ubuntu) than OS XCMake 在 Linux (Ubuntu) 上使用“target_include_directories”的方式与在 OS X 上不同
【发布时间】:2018-05-18 01:00:03
【问题描述】:

我有一个多目标 CMake 文件,其中所有目标都可以在 OS X 上正常构建,但是当我在 Ubuntu Linux 上构建目标时,它不会链接在 target_include_directories 中添加的系统库。

这是一个目标示例(每个目标都相似)。

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_link_libraries”命令的工作方式与上面列出的一样,并且采用 -lxml2 格式。

我尝试在 linux 上添加“pthreads”库(因为它要求这样做,但在 OS X 上没有),而我能够添加它的唯一方法是

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

但是,这是针对所有目标的全局设置。基本上,如果我将 pthread 放入 target_link_libraries 中,它就会被忽略,就像它们的其余部分一样。

我应该如何最好地将这些库添加到目标中?也许我在 OS X 方面遗漏了一些东西,而它恰好可以工作?

【问题讨论】:

  • 您有两个不同的问题(库问题和-pthread 链接器标志问题),请保持每个问题一个问题。
  • 关于图书馆的问题,你的什么问题?你得到什么错误?您能否向我们展示详细构建的输出(显示命令的位置)?
  • 如果您有未定义的引用错误,那么您的问题来自target_link_libraries() 命令,而不是target_include_directories()
  • IF(PLATFORM) 如此处所述:stackoverflow.com/a/9160449/2979092

标签: c++ cmake


【解决方案1】:

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

与其设置库名称并告诉您程序针对它们进行编译,不如尝试使用 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

【讨论】:

  • 我认为 target_include_directories PRIVATE 标志是封装要编译的标头+源。我设置为 SYSTEM INTERFACE,但现在在尖括号中找不到它们。我想我正在取得进展,但还不能确定。尝试了您的建议 - 我在 add_executable 中有 SOURCE_FILES 您放置 XML 库的位置 - 我无法删除 SOURCE_FILES + 我尝试过的替代方案没有验证。
  • nvm 关于 PRIVATE 标志的评论。我似乎得到了一些工作。
  • 在库包含后添加依赖项修复了问题。我以为我已经尝试过了,但是多目标混淆了我的很多测试,并且一些小问题也混淆了一些东西。 pthreads 现在也可以正常工作了。
猜你喜欢
  • 2014-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-22
  • 2015-08-11
相关资源
最近更新 更多