How to compile eigen with VS2019, /std:c++latest and /Zc:__cplusplus - visual-studio-2019

I'm trying to compile eigen 3.3.9 fron the github mirror with VS2019, /std:c++latest and /Zc:__cplusplus
What i get is a
eigen\Eigen\src\Core\util\Meta.h(320,25): error C2039: 'result_of': is not a member of 'std'
because EIGEN_HAS_STD_RESULT_OF is defined. This get's determined here:
#ifndef EIGEN_HAS_STD_RESULT_OF
#if EIGEN_MAX_CPP_VER>=11 && ((__has_feature(cxx_lambdas) || (defined(__cplusplus) && __cplusplus >= 201103L)))
#define EIGEN_HAS_STD_RESULT_OF 1
#else
#define EIGEN_HAS_STD_RESULT_OF 0
#endif
#endif
From what i can read, std::result_of is removed in C++20 which is not reflected in the check above.
Am i doing something wrong? Is there an easy way to compile eigen with VS, C++20 and a __cplusplus define which reflects the actual standard version without having to manually set all the defines myself or patching Macros.h?

Related

Use define between systemverilog and DPI-C

In systemverilog sv_define.vh
`define A_MODULE_ENABLE
//`define B_MODULE_ENABLE
In C c_define.h
#define A_MODULE_ENABLE
//#define B_MODULE_ENABLE
Since syntax for "define" is different between systemverilog and C.
If I want to config ENABLE, I have to modify those two files, that would sometimes be troublesome. How can I just define them in a single file and include it ? Thanks a lot.
My imagination: my top.sv and top.c would include the same file: c_sy_define.vh
The content would be:
__SV__
`define A_MODULE_ENABLE
//`define B_MODULE_ENABLE
__C__
#define A_MODULE_ENABLE
//#define B_MODULE_ENABLE
Yeap. This will probably work. Never try it though.
#ifndef COMPILE_IN_C
`define A_MODULE_ENABLE
#endif
`ifndef COMPILE_IN_SV
#define A_MODULE_ENABLE
`endif
Wen you compile the header file, make sure you add "-define COMPILE_IN_SV" in ncvlog (say you use Cadence), and add "-DCOMPILE_IN_C" in gcc.

Xcode 7.3: "Ambiguous expansion of macro" when re-defining macro in prefix file

I am using Xcode 7.3, and I am getting an "Ambiguous expansion of macro" warning, for a macro which was defined in Foundation, but which I have undefined and re-defined in my prefix file. I have modules enabled.
To reproduce:
Set "Enable Modules (C and Objective-C)" to Yes in build settings
Use the following prefix file:
#import <Foundation/Foundation.h>
#undef assert
#define assert(e) NSLog(#"hi") // implementation is not important
Use the following main source file:
int main() {
assert(42);
return 0;
}
Then build in Xcode.
It shows an "Ambiguous expansion of macro 'assert'" warning on the line in the source file that uses the "assert" macro. The "Expanding this definition of 'assert'" points to the definition from the system header, not my redefinition. The "Other definition of 'assert'" points to the definition in my prefix file.
This warning does not happen when modules is disabled.
This is a bug in Xcode; we'd appreciate if you could file a bug report at https://bugreport.apple.com and leave the bug # in a comment here. Your options for working around this bug in the meantime are:
You could use a different name than "assert" for this macro.
You could set the GCC_PRECOMPILE_PREFIX_HEADER build setting to NO, since PCH don’t provide a lot of benefit when you already have modules. The prefix header will still work, it just won’t be turned into a PCH.
You could turn off modules.

Xcode MyProjectName-Bridging-Header.h does not exist

I want to start using Swift in my Objective-C project. So i added a swift class:
import Foundation
#objc class System : NSObject {
#objc func printSome() {
println("Print line System");
}
}
And imported it into a .m file:
#import "MyProjectName-Swift.h"
When building my project i get the following error:
Bridging header 'PathToMyProject/MyProjectName-Bridging-Header.h' does not exist
NOTE: Under "Build Settings->Swift Compiler - Code Generation->Objective-C Briding Header" is set to MyProjectName-Bridging-Header.h
What should i do to solve this issue?
Any help is much appreciated.
EDIT: Bridging-Header file:
#if defined(__has_include) && __has_include()
# include
#endif
#include <objc/NSObject.h>
#include <stdint.h>
#include <stddef.h>
#include <stdbool.h>
#if defined(__has_include) && __has_include(<uchar.h>)
# include <uchar.h>
#elif __cplusplus < 201103L
typedef uint_least16_t char16_t;
typedef uint_least32_t char32_t;
#endif
#if !defined(SWIFT_PASTE)
# define SWIFT_PASTE_HELPER(x, y) x##y
# define SWIFT_PASTE(x, y) SWIFT_PASTE_HELPER(x, y)
#endif
#if !defined(SWIFT_METATYPE)
# define SWIFT_METATYPE(X) Class
#endif
#if defined(__has_attribute) && __has_attribute(objc_runtime_name)
# define SWIFT_RUNTIME_NAME(X) __attribute__((objc_runtime_name(X)))
#else
# define SWIFT_RUNTIME_NAME(X)
#endif
#if !defined(SWIFT_CLASS_EXTRA)
# define SWIFT_CLASS_EXTRA
#endif
#if !defined(SWIFT_PROTOCOL_EXTRA)
# define SWIFT_PROTOCOL_EXTRA
#endif
#if !defined(SWIFT_CLASS)
# if defined(__has_attribute) && __has_attribute(objc_subclassing_restricted)
# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_CLASS_EXTRA
# else
# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA
# endif
#endif
#if !defined(SWIFT_PROTOCOL)
# define SWIFT_PROTOCOL(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA
#endif
#if !defined(SWIFT_EXTENSION)
# define SWIFT_EXTENSION(M) SWIFT_PASTE(M##_Swift_, __LINE__)
#endif
#if !defined(OBJC_DESIGNATED_INITIALIZER)
# if defined(__has_attribute) && __has_attribute(objc_designated_initializer)
# define OBJC_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer))
# else
# define OBJC_DESIGNATED_INITIALIZER
# endif
#endif
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wproperty-attribute-mismatch"
#if defined(__has_feature) && __has_feature(modules)
#endif
#pragma clang diagnostic pop
If the bridging file is created at the same level as the other classes, you might need to add the relative path, as these pictures show. Note here that the bridging file is created at the same level as the other classes:
I have the name entered correctly in the Build Settings,
but the compiler doesn't find the file.
Therefore, if I add the relative path from the root of the project (that is, I add ./ProjectName/BridgerFileName.h),
now it compiles and I can call a method in my Objective C class:
I found that after creating the bridging header file manually and choosing the default name and location, the bridging header will be placed in the project directory, which is under the root directory.
This requires the following value for the setting: Targets > [Your App Target] > Build Settings > Swift Compiler - Code Generation > Objective-C Bridging Header:
$(SRCROOT)/$(PROJECT_NAME)/$(PROJECT_NAME)-Bridging-Header.h
Note that if your project is a swift module (framework) then, as pointed out in the comments, you might prefer:
$(SRCROOT)/$(PROJECT_NAME)/$(SWIFT_MODULE_NAME)-Bridging-Header.h
For those who are removing the Bridging Header
I was going the opposite way as most of the other answers here. I had been using a Bridging Header previously, but I didn't need it anymore. After I deleted it from my project I started getting the error mentioned in the question. I performed the following steps to solve my problem.
Go to Targets > [Your App Target] > Build Settings > Swift Compiler - General > Objective-C Bridging Header and delete the path. (Thanks to #Donamite for the idea.) (You can just start typing "bridging" into the search box to find it.)
Delete the derived date. Go to Xcode > Preferences > Locations and click the gray arrow by the Derived Data folder. Then delete your project folder.
In Swift 4.1
your project you don't have bridging-Header.h file, but your project has that path. For this you need to delete that path...
Go to targets file and select Build Settings, ---->Swift Compiler - General, and delete the bridging-Header.h. Follow below screen shots....
Delete the bridging-Header.h file in Swift Compiler - General
Now you got like this...
These are steps to create Bridging header.
File->New->iOS->Header File, Give the bridging file name as like "yourProjectName-Bridging-Header.h"
Build-Settings->Objective-C Bridging Header, Just give the bridging header file name be like "ProjectName-Bridging-Header.h"
NOTE: Bridging header file should be located in the main root folder of the project where the ".xcodeproj" file located. If not move the Bridging header file to the root folder of the project. This way Xcode able to access the bridge file.
Build the project, and import necessary files in Bridging header.
To add Bridge File in Swift project.
Step 1. Go to File > Add Cocoa with Objective-C File (For temporary Purpose)
Step 2. Then the following pop up will appear
Now press Create Bridging Header Button
DONE
YOU WILL GET BRIGDE FILE IN BUNDLE
THANKS
For me it helped to use $(SRCROOT)/$(PROJECT_NAME)/ in front of my bridging header file path
For me it helped to use $(SRCROOT) in front of my Objective-C bridging header path.
$(SRCROOT)/swiftLibraries/swiftLibraries-Bridging-Header.h
Follow the steps below:
Delete bridging header file . . . (Maybe you create manually) and;
Create new Swift file in Objective-C Project . . . (Not import, first create it)
Maybe these two things will help solve your problem.
The following worked for me:
Bridging header file should be located in the main root folder of the project where the ".xcodeproj" file located. Move to project directory and drag and drop bridging header to root if it is inside any other folder.
Correct spelling mistakes in header name.
Clear Derived data
Target -> Build Settings -> Swift Compiler : General -> Add Obj C Header name.
Clean and run again.
Creating Bridging Header File Manually
First of all delete the Bridging header file which Xcode is created. And Select your project goto > Build Settings > Search the keyword. Swift Compiler - Code Generation. Click on Objective-C Bridging Header , delete that path. Now clean your Project.
Now select your project > Window in the navigation bar . Select Projects and delete your derived data from there.
Now create a new file , select the Source and then select the Header File and create your Bridging header file . File name must be your projectname-Bridging-Header.h and then create it
Select your project goto > Build Settings > Search the keyword. Swift Compiler - Code Generation. Click on Objective-C Bridging Header and now add the path in this Objective-C Bridging Header like projectname-Bridging-Header.h
Now import your classes into bridging header file and you can compile it your code easily.
Your bridging header file looks like this when you are creating your file manually.
What helped me was to move the file manually to the path mentioned in an error message. So:
I deleted the file (moved to trash)
Moved it from trash to the path in an error message
Later I also had to clean the project

Macro defination in ios custom framework is not working

Can please any one tell how to use macros like debuglog by using print some information to console while building a framework in ios, and it should work when application developer runs the application with this framework in debug mode.
1) define a global BOOL in your library with some odd name:
BOOL GzRkYr22; // (use your framework name as prefix or suffix)
2) provide some means for your users to turn the flag on or off:
- (void)enabledDebuggingMessages:(BOOL)val;
That method will set the global flag.
3) Put this in your .pch file
extern BOOL GzRkYr22;
#define Log(format, ...) \
do { if(GzRkYr22 ) NSLog(format, \
## __VA_ARGS__); \
} while(NO)
4) Sprinkle your code with Log messages:
Log(#"Just did %d operations", someNumber);
5) If you later decide you want to only have log messages for a “debug” version of your library, but totally disable them for "production" versions:
#ifndef NDEBUG // some macro that is defined or not defined for the different modes
#define Log(format, ...) \
do { if(GzRkYr22 ) NSLog(format, \
## __VA_ARGS__); \
} while(NO)
#else
#define Log(format, ...)
#endif

Preprocessor Directives to separate targets in xcode

I have 2 targets on my project one production and one stage with different configurations.
I want in the code to be able to say
#if target == production
NSLog(#"production");
#elif target == stage
NSLog(#"stage");
#endif
Can someone please tell me how can I do that?
Thank you,
~Sonic555gr
You can define some Preprocessor Macros for each Target, like this...
And then you can do something like this:
#ifdef PRODUCTION
//some Code
#elif STAGE
//some other Code
#else
//more Code^^
#endif
But be carefull if you need it in Debug- and/or in Release-Build, you have to declare it there.

Resources