Comments (14)
So in case you (or anyone else) is wondering, the "default flags" used when building your addon comes from node's common.gypi
file.
As you can see if you scroll through that file -fno-rtti
is indeed a default. So in your own gyp file, you must negate that. This involves specifying the cflags
with a !
at the end, meaning "not". In the case of -fno-rtti
, it's specified in the cflags_cc
section, so try adding this:
...
'cflags_cc!': [ '-fno-rtti' ]
...
Additionally, Mac builds usually have their own section to specify these flags, so you usually have to fix this twice (don't ask me why, gyp just kinda is weird in that case), so for Macs, add this (note that the "xcode_settings" name will vary depending on the flag you are enabling/disabling):
...
['OS=="mac"', {
'xcode_settings': {
'GCC_ENABLE_CPP_RTTI': 'YES'
}
}]
...
That should do it. For completeness sake, this is a barebones gyp file compatible with node-gyp that should have RTTI enabled:
{
'targets': [
{
'target_name': 'bindings',
'sources': [ 'bindings.cc' ],
'cflags_cc!': [ '-fno-rtti' ],
'conditions': [
['OS=="mac"', {
'xcode_settings': {
'GCC_ENABLE_CPP_RTTI': 'YES'
}
}]
]
}
]
}
Reopen if that doesn't work for you. Cheers!
from node-gyp.
For the /EHsc
issue, with VS Build Tools 2017 and node v12.9.1 the below worked in the bindings.gyp:
"targets": [
{
"target_name": "addon",
"cflags!": [ "-fno-exceptions" ],
"cflags_cc!": [ "-fno-exceptions" ],
"sources": [ "addon.cc" ],
"include_dirs": [
"<!@(node -p \"require('node-addon-api').include\")"
],
'defines': [ 'NAPI_DISABLE_CPP_EXCEPTIONS' ],
'msvs_settings': {
'VCCLCompilerTool': {
'ExceptionHandling': '1',
'AdditionalOptions': ['/EHsc']
}
}
}
Sharing here in case anyone facing the same problem:
warning C4530: C++ exception handler used, but unwind semantics are not enabled. Specify /EHsc (compiling source file
..\addon.cc) [..\build\addon.vcxproj]
from node-gyp.
Adding the following seems to solve the issue on OSX:
'conditions': [
['OS=="mac"', {
'xcode_settings': { 'GCC_ENABLE_CPP_RTTI': 'YES' }
}]
]
I cannot test on linux, but there's a Chromium example that suggests it could be:
[ 'OS=="linux" or OS=="freebsd" or OS=="openbsd" or OS=="solaris"',
{
'cflags_cc!': ['-fno-rtti'],
'cflags_cc+': ['-frtti'],
}
]
from node-gyp.
I'm still struggling to fix this on Windows. I get an error
error LNK2001: unresolved external symbol "void __cdecl boost::throw_exception
which seems to stem from an earlier warning:
warning C4530: C++ exception handler used, but unwind semantics are not enabled. Sp
ecify /EHsc
I tried adding the following but it doesn't seem to add /EHsc.
'msvs_settings': {
'VCCLCompilerTool': {
'ExceptionHandling': '2', # /EHsc
},
}
This is likely more node-gyp
ignorance but ideas are appreciated.
from node-gyp.
Looks like default settings are different in the Release configuration. The fix is:
'configurations': {
'Release': {
'msvs_settings': {
'VCCLCompilerTool': {
'ExceptionHandling': 1,
}
}
}
},
This seems to have changed multiple times over the last several versions.
from node-gyp.
Adding /EHsc on Windows...hope it helps - took me a little bit of trial/error and searching around.
Inside of 'target_defaults':
'configurations':
{
'Debug':
{
'defines': [ 'DEBUG', '_DEBUG' ],
'msvs_settings':
{
'VCCLCompilerTool':
{
'RuntimeLibrary': 3, # shared debug
'ExceptionHandling': 1, # /EHsc doesn't work.
'/EHsc' # Enable unwind semantics for Exception Handling. This one actually does the trick
# this is also where you can put /GR or /MDd, or other defines.
}
}
},
'Release':
{
'VCCLCompilerTool':
{
'RuntimeLibrary': 2, # shared release
'ExceptionHandling': 1, # /EHsc doesn't work.
'/EHsc' # Enable unwind semantics for Exception Handling. This one actually does the trick
# this is also where you can put /GR or /MD, or other defines.
}
}
}
Example using node-gyp to build MySQL C++ Connector, overriding defaults. It uses C++ Exception Handler and so as you will see the warning has been suppressed because unwind semantics are now enabled:
EDIT: Closed the code block fence
EDIT 2: Adding why
WHY: Because this issue shows up on Google as #1 for me for a couple of different things I've had to search for...this puts the answers I've found here -> I realize this issue is closed sorry for confusion.
from node-gyp.
I've tried all the things listed here and in #857, but I still can't get RTTI enabled in my auto-generated MSVS 2015 project. Here is my binding.gyp below (Oh, I'm using nbind with Electron). I have all the methods I've tried listed in this file contents below, but I also tried them separately to no avail...
{
'targets': [
{
'includes': [
'auto.gypi'
],
'sources': [
'addon.cc'
],
'cflags_cc!': [
'-fno-rtti'
],
'conditions':
[
[
'OS=="mac"',
{
'xcode_settings': { 'GCC_ENABLE_CPP_RTTI': 'YES' }
},
],
[
'OS=="win"',
{
'cflags': [
'/GR',
],
'configurations': {
'Debug': {
'msvs_settings': {
'VCCLCompilerTool': {
'RuntimeTypeInfo': 'true',
'AdditionalOptions': ['/GR'],
}
}
},
'Release': {
'msvs_settings': {
'VCCLCompilerTool': {
'RuntimeTypeInfo': 'true',
'AdditionalOptions': ['/GR'],
}
}
}
}
}
]
],
'defines': [
'_WIN32_WINNT=0x0601'
],
'include_dirs': [
'C:/Program Files/boost/boost_1_62_0'
],
'link_settings': {
'library_dirs': [
'C:\\Program Files\\boost\\boost_1_62_0\\lib64-msvc-14.0'
]
}
}
],
'includes': [
'auto-top.gypi'
]
}
from node-gyp.
@tristanz That looks correct to me :) Glad you got it figured out.
from node-gyp.
Terrific. Thanks!
from node-gyp.
Does anyone know why -fno-rtti was used as a default? Any particular reason?
from node-gyp.
@edhemphill node-gyp uses the same configuration as when node itself it built, so the answer is because node itself doesn't need rtti.
from node-gyp.
thanks...
from node-gyp.
I'm hitting this same issue on windows. I'm finding it impossible to override the ExceptionHandling
value (which for me like @tristanz breaks my build with linking errors). The only workaround I can find (as mentioned at brianmcd/contextify#45) is to manually modify the common.gypi
that node-gyp bundles from node itself.
I'm putting
'msvs_settings': {
'VCCLCompilerTool': {
'ExceptionHandling': 1,
}
}
in my binding.gyp, trying both release and debug configurations and 'ExceptionHandling': 0
still ends up in the visual studio output file. I'm on windows 7 with node v0.10.3 and node-gyp v0.9.5 installed globally.
from node-gyp.
ugh... looks like a gyp bug/complexity that may require modifying how node's common.gypi is written: https://groups.google.com/forum/?fromgroups=#!topic/gyp-developer/p98GJxYJuH4
from node-gyp.
Related Issues (20)
- unable to verify the first certificate
- node-gyp rebuild is triggered when using a private registry HOT 13
- mac sqlite3 system lib fmdb HOT 2
- node-gyp fails on Sonoma with CLI only and not XCode (Mac M1 / Apple Silicon) HOT 11
- node-gyp verison used when npm -install are not align to installed node-gyp version HOT 1
- msvs_version option seems ineffectual in selecting correct msbuild.exe HOT 4
- node-gyp keep downloading header even there is cache
- M2 yarn install failed? HOT 4
- Why gyp is using unofficial-builds.nodejs.org to download node-headers ? HOT 1
- cannot install better-sqlite3 HOT 2
- Mutable default arguments in Python code HOT 1
- tar.Extract is not a function HOT 2
- find-python broke with 18.20.0 (?) on ARM HOT 5
- gyp ERR! UNCAUGHT EXCEPTION gyp ERR! stack Error: spawn C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\15.0\Bin\MSBuild.exe ENOENT
- [Request] Upgrade tar to v6.2.1 HOT 6
- test/test-find-visualstudio.js may fail on Windows on ARM
- complie_commands.json generated by node-gyp doesn't be in clangd search path. HOT 6
- generate compile_commands.json automatically
- Generate .gitignore and .hgignore in build
- Customize default generator
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from node-gyp.