CMake 在 Linux (Ubuntu) 上使用"target_include_directories"的方式与 OS X 不同

CMake uses "target_include_directories" differently on Linux (Ubuntu) than OS X

本文关键字:directories include 方式 不同 OS target Ubuntu CMake Linux      更新时间:2023-10-16

我有一个多目标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侧缺少一些东西,它恰好工作了吗?

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

您不应该尝试使用find_library()来查找库,而不是设置库名称并告诉您对它们进行编译,而是应该尝试与CMAKE命令产生的变量链接程序。这样,Cmake实际上可能会告诉您是否找不到库。

例如:

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

这样,您可以提供几个可能的库名称(例如,根据您要编译的系统,名称可能不同)。另外,您可以告诉CMAKE在不更改CMakeLists.txt的情况下查看其他目录(例如CMAKE_LIBRARY_PATH)。

您还应该检查为您感兴趣的依赖项提供配置的CMAKE模块(CMAKE 3.7具有FindLibXml2模块)。

对于pthread,您应该检查CMAKE的FindThreads