Pra*_*sad 74 c++ linux portability mingw cmake
我是CMAKE的初学者.下面是一个简单的cmake文件,适用于mingw环境窗口.问题显然target_link_libraries()是CMAKE的功能,我链接libwsock32.a.在Windows中这是有效的,我得到了结果.
但是,正如预期的那样,在Linux中,/usr/bin/ld将寻找-lwsock32Linux操作系统中不存在的内容.
我的问题是:我如何指示CMAKE避免在Linux OS中链接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 )
Run Code Online (Sandbox Code Playgroud)
rel*_*xxx 109
使用
if (WIN32)
#do something
endif (WIN32)
Run Code Online (Sandbox Code Playgroud)
要么
if (UNIX)
#do something
endif (UNIX)
Run Code Online (Sandbox Code Playgroud)
要么
if (MSVC)
#do something
endif (MSVC)
Run Code Online (Sandbox Code Playgroud)
或类似的
mlv*_*ljr 57
鉴于这是一个常见的问题,geronto发布:
if(UNIX AND NOT APPLE)
set(LINUX TRUE)
endif()
# if(NOT LINUX) should work, too, if you need that
if(LINUX)
message(STATUS ">>> Linux")
# linux stuff here
else()
message(STATUS ">>> Not Linux")
# stuff that should happen not on Linux
endif()
Run Code Online (Sandbox Code Playgroud)
Afr*_*Afr 40
您可以检测并指定多个操作系统的变量,如下所示:
if(WIN32)
# for Windows operating system in general
endif()
Run Code Online (Sandbox Code Playgroud)
要么:
if(MSVC OR MSYS OR MINGW)
# for detecting Windows compilers
endif()
Run Code Online (Sandbox Code Playgroud)
if(APPLE)
# for MacOS X or iOS, watchOS, tvOS (since 3.10.3)
endif()
Run Code Online (Sandbox Code Playgroud)
if(UNIX AND NOT APPLE)
# for Linux, BSD, Solaris, Minix
endif()
Run Code Online (Sandbox Code Playgroud)
要解决Windows特定wsock32库的问题,只需将其从其他系统中删除,如下所示:
if(WIN32)
target_link_libraries(${PROJECT_NAME} bioutils wsock32)
else
target_link_libraries(${PROJECT_NAME} bioutils)
endif()
Run Code Online (Sandbox Code Playgroud)
leg*_*s2k 31
避免使用WIN32、等。摘自官方论坛APPLE版主的回复:
\n\n、
\nWIN32、等变量是 \xe2\x80\x9csoft\xe2\x80\x9d 已弃用 [...]是我\xe2\x80\x99d 在 CMake 代码中使用的,APPLE在生成器表达式中需要。UNIXCMAKE_SYSTEM_NAMEPLATFORM_ID
CMAKE_SYSTEM_NAME可以或取什么可能的值PLAFORM_ID? 参考来源。
使用STREQUAL:
if (CMAKE_SYSTEM_NAME STREQUAL "Linux")\n # Linux-specific stuff\nendif ()\nRun Code Online (Sandbox Code Playgroud)\n创建一个列表变量并使用IN_LIST:
set(OPENGL_PLATFORMS Linux Windows)\nif (CMAKE_SYSTEM_NAME IN_LIST OPENGL_PLATFORMS)\n # platform-specific stuff e.g.\n find_package(OpenGL REQUIRED)\nendif ()\nRun Code Online (Sandbox Code Playgroud)\n使用PLATFORM_ID:
target_link_libraries(TARGET_NAME PRIVATE\n $<$<PLATFORM_ID:Linux,Windows>:OpenGL::GL>)\nRun Code Online (Sandbox Code Playgroud)\n旁白:生成器表达式只有在手册指出的情况下才能使用。例如,target_link_libraries文档中提到了这一点,而set_target_properties没有。我想阅读CMake: set_target_properties 失败,目标由生成器表达式定义,以了解原因。
小智 17
你有CMAKE的一些特别的话,看看:
if(${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
// do something for Linux
else
// do something for other OS
Run Code Online (Sandbox Code Playgroud)
我想把这个留在这里,因为我在使用 Android SDK 在 Windows 中编译 Android 时遇到了这个问题。
CMake 区分 TARGET 和 HOST 平台。
我的目标是 Android,因此像 CMAKE_SYSTEM_NAME 这样的变量的值为“Android”,并且此处其他答案中的变量 WIN32 未定义。但我想知道我的主机系统是否是 Windows,因为在 Windows、Linux 或 IO 上进行编译时,我需要做一些不同的事情。为此,我使用了 CMAKE_HOST_SYSTEM_NAME ,我发现它在任何地方都几乎不为人知或提及,因为对于大多数人来说,TARGEt 和 HOST 是相同的,或者他们不关心。
希望这对某个地方的人有帮助......
生成器表达式也是可能的:
target_link_libraries(
target_name
PUBLIC
libA
$<$<PLATFORM_ID:Windows>:wsock32>
PRIVATE
$<$<PLATFORM_ID:Linux>:libB>
libC
)
Run Code Online (Sandbox Code Playgroud)
这将在Windows上链接libA,wsock32和libC,在Linux上链接libA,libB和libC
试试看:
if(WIN32)
set(ADDITIONAL_LIBRARIES wsock32)
else()
set(ADDITIONAL_LIBRARIES "")
endif()
target_link_libraries(${PROJECT_NAME} bioutils ${ADDITIONAL_LIBRARIES})
Run Code Online (Sandbox Code Playgroud)
您可以在此处找到其他有用的变量.