如果有一些跨平台的C/C++代码应该在Mac OS X,iOS,Linux,Windows上编译,我如何在预处理器进程中可靠地检测它们?
我想在Linux和Windows上运行一些c ++代码.有些代码我只希望包含在一个操作系统中,而不包含在另一个操作系统中.是否有标准的#ifdef可以使用?
就像是:
#ifdef LINUX_KEY_WORD
... // linux code goes here.
#elif WINDOWS_KEY_WORD
... // windows code goes here.
#else
#error "OS not supported!"
#endif
Run Code Online (Sandbox Code Playgroud)
问题确实是重复的,但这里的答案要好得多,尤其是被接受的答案.
我正在编写一个跨平台的代码,它应该在linux,windows,Mac OS上编译.在窗户上,我必须支持视觉工作室和mingw.
有一些特定于平台的代码,我应该放在#ifdef .. #endif环境中.例如,这里我放置了win32特定代码:
#ifdef WIN32
#include <windows.h>
#endif
Run Code Online (Sandbox Code Playgroud)
但是我如何识别linux和mac OS?我应该使用什么定义名称(或等)?
在编译C或C++代码时,找出CPU架构最可靠的方法是什么?据我所知,不同的编译器有自己的一套非标准预处理器定义(_M_X86在MSVS中__i386__,__arm__在GCC 中等).
有没有一种标准的方法来检测我正在构建的架构?如果没有,是否有各种编译器的这种定义的综合列表的来源,例如包含所有样板#ifdef的标题?
我是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) 我正在编写一个跨平台程序.我希望这个程序在Windows和Linux下运行,所以我有两个不同的代码段用于这两个平台.如果操作系统是Windows,我想要运行第一个代码段; 如果它是Linux,那么我希望第二个代码段运行.
所以我编写了以下代码,但在Windows和Linux上构建时都会出错.我该怎么做才能解决它?
#ifdef __unix__ /* __unix__ is usually defined by compilers targeting Unix systems */
#define OS_Windows 0
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#elif defined(_WIN32) || defined(WIN32) /* _Win32 is usually defined by compilers targeting 32 or 64 bit Windows systems */
#define OS_Windows 1
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
#define DIV 1048576
#define WIDTH 7
#endif
int main(int argc, char *argv[])
{
if(OS_Windows)
{
MEMORYSTATUSEX statex;
statex.dwLength = sizeof (statex);
GlobalMemoryStatusEx (&statex);
_tprintf (TEXT("There …Run Code Online (Sandbox Code Playgroud) 用于区分Linux和Mac OSX的GCC/G ++宏?
我常常看到__WIN32,WIN32或者__WIN32__.我认为这取决于使用的预处理器(来自visual studio,或gcc等).
我现在必须首先检查os,然后检查使用过的编译器吗?我们在这里使用G ++ 4.4.x,Visual Studio 2008和Xcode(我假设它是gcc)和我们正在使用的ATM __WIN32__,__APPLE__和__LINUX__.
我注意到在MacOS X(Lion)中,__unix__没有定义宏.由于MacOS源于BSD UNIX,不应该是这样吗?
是否有可能让编译器/预处理器知道我希望它被视为UNIX系统?
我在接受采访时被问到,如何通过提供可运行的C代码来识别平台?
代码必须在两个平台上都可以运行(即没有用于检查的特殊头文件函数)?
c++ ×8
linux ×5
c ×4
macros ×4
windows ×3
macos ×2
cmake ×1
compile-time ×1
detection ×1
gcc ×1
ifdefine ×1
mingw ×1
os-detection ×1
portability ×1
unix ×1