CMAKE 中的操作系统特定说明:如何?

新手上路,请多包涵

我是 CMAKE 的初学者。下面是一个简单的 cmake 文件,它在 mingw 环境窗口中运行良好。问题显然出在 target_link_libraries() 我正在链接 libwsock32.a 的 CMAKE 功能上。在 Windows 中,这是可行的,我得到了结果。

然而,正如预期的那样,在 Linux 中, /usr/bin/ld 将寻找 -lwsock32 这在 Linux 操作系统上不存在。

我的问题是:如何指示 CMAKE 避免在 Linux 操作系统中链接 wsock32 库???

任何帮助将不胜感激。

我的简单 CMake 文件:

  PROJECT(biourl)
 set (${PROJECT_NAME}_headers ./BioSocketAddress.h  ./BioSocketBase.h ./BioSocketBuffer.h ./BioSocketCommon.h  ./BioSocketListener.h  ./BioSocketPrivate.h  ./BioSocketStream.h ./BioUrl.h BioDatabase.h )

set (${PROJECT_NAME}_sources BioSocketAddress.C  BioSocketBase.C  BioSocketCommon.C BioSocketStream.C  BioUrl.C BioDatabase.C )

add_library(${PROJECT_NAME} STATIC ${${PROJECT_NAME}_headers} ${${PROJECT_NAME}_sources} )

# linkers
#find_library(ws NAMES wsock32 PATHS ${PROJECT_SOURCE_DIR} NO_SYSTEM_ENVIRONMENT_PATH NO_DEFAULT_PATH)

target_link_libraries(${PROJECT_NAME} bioutils wsock32)

install (TARGETS ${PROJECT_NAME}
       RUNTIME DESTINATION bin
       LIBRARY DESTINATION lib
       ARCHIVE DESTINATION lib/archive )

原文由 Prasad 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 593
2 个回答

利用

if (WIN32)
    # do something
endif (WIN32)

或者

if (UNIX)
    # do something
endif (UNIX)

或者

if (MSVC)
    # do something
endif (MSVC)

或类似的

请参阅 CMake 有用变量CMake 检查平台

原文由 relaxxx 发布,翻译遵循 CC BY-SA 4.0 许可协议

现代 CMake 方式

避免使用 WIN32 , APPLE官方论坛 版主回复摘录:

The WIN32 , APPLE , UNIX , etc. variables are “soft” deprecated […] CMAKE_SYSTEM_NAME is what I’d在 CMake 代码中使用,生成器表达式中需要 PLATFORM_ID

CMAKE_SYSTEM_NAMEPLAFORM_ID 可以取哪些可能的值? 参考来源

如何检测平台

使用 STREQUAL

 if (CMAKE_SYSTEM_NAME STREQUAL "Linux")
  # Linux-specific stuff
endif ()

如何检测多个平台

创建一个列表变量并使用 IN_LIST

 set(OPENGL_PLATFORMS Linux Windows)
if (CMAKE_SYSTEM_NAME IN_LIST OPENGL_PLATFORMS)
  # platform-specific stuff e.g.
  find_package(OpenGL REQUIRED)
endif ()

生成器表达式

使用 PLATFORM_ID

 target_link_libraries(TARGET_NAME PRIVATE
  $<$<PLATFORM_ID:Linux,Windows>:OpenGL::GL>)

旁白:生成器表达式只能在手册调用时使用。例如 target_link_libraries 的文档中提到了它,而 set_target_properties 没有。我想阅读 CMake:set_target_properties 失败,目标由生成器表达式定义 以了解原因。

原文由 legends2k 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题