【发布时间】: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