Why can't I explicitly `-I /usr/include`?
Both gcc and clang seem to silently discard /usr/include
from the list of include directories when explicitly included via -I
.
Is there a specific reason as to why common compilers apparently don't allow to include the system's include dir?
background:
Suppose you depend on a header file located in /usr/include
while having inherited a directory containing an incompatible version of the same header from your build system via the CPATH
environment variable (effectively appending that directory to the -I
list from the right).
gcc include clang
add a comment |
Both gcc and clang seem to silently discard /usr/include
from the list of include directories when explicitly included via -I
.
Is there a specific reason as to why common compilers apparently don't allow to include the system's include dir?
background:
Suppose you depend on a header file located in /usr/include
while having inherited a directory containing an incompatible version of the same header from your build system via the CPATH
environment variable (effectively appending that directory to the -I
list from the right).
gcc include clang
1
Create a new directory, symlink the files you want there, and point -I at that new directory. This avoids side effects that you do not control.
– Marc Glisse
Nov 22 at 21:36
add a comment |
Both gcc and clang seem to silently discard /usr/include
from the list of include directories when explicitly included via -I
.
Is there a specific reason as to why common compilers apparently don't allow to include the system's include dir?
background:
Suppose you depend on a header file located in /usr/include
while having inherited a directory containing an incompatible version of the same header from your build system via the CPATH
environment variable (effectively appending that directory to the -I
list from the right).
gcc include clang
Both gcc and clang seem to silently discard /usr/include
from the list of include directories when explicitly included via -I
.
Is there a specific reason as to why common compilers apparently don't allow to include the system's include dir?
background:
Suppose you depend on a header file located in /usr/include
while having inherited a directory containing an incompatible version of the same header from your build system via the CPATH
environment variable (effectively appending that directory to the -I
list from the right).
gcc include clang
gcc include clang
asked Nov 22 at 20:40
vega8
5071320
5071320
1
Create a new directory, symlink the files you want there, and point -I at that new directory. This avoids side effects that you do not control.
– Marc Glisse
Nov 22 at 21:36
add a comment |
1
Create a new directory, symlink the files you want there, and point -I at that new directory. This avoids side effects that you do not control.
– Marc Glisse
Nov 22 at 21:36
1
1
Create a new directory, symlink the files you want there, and point -I at that new directory. This avoids side effects that you do not control.
– Marc Glisse
Nov 22 at 21:36
Create a new directory, symlink the files you want there, and point -I at that new directory. This avoids side effects that you do not control.
– Marc Glisse
Nov 22 at 21:36
add a comment |
1 Answer
1
active
oldest
votes
GCC ignores -I/usr/include
because it is a system header directory by default, and using -I
would turn it into non-system header, leading to confusing behavior, particularly with system headers that are not entirely aligned with language standards. (GCC gives system headers more latitude and suppresses warnings, for example.)
If you use -isystem /usr/include
, then /usr/include
moves to the front of the search list. However, you will likely have to move the other default search path entries as well, to avoid breaking too many things. gcc -v
will print the entire search path.
But please don't use-isystem /usr/include
. The system headers are searched in a very specific order, and changing that order will break things.
– Marc Glisse
Nov 22 at 21:34
Good point, it will likely be necessary to move the other default search paths as well.
– Florian Weimer
Nov 22 at 21:38
-isystem
wouldn't be able to overrideCPATH
anyway since it has lower precedence thanCPATH
(which effectively is equivalent to-I
).
– vega8
Nov 23 at 14:56
-nostdinc
could help, though that's going to be a fragile hack.
– Marc Glisse
Nov 24 at 22:25
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53437754%2fwhy-cant-i-explicitly-i-usr-include%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
GCC ignores -I/usr/include
because it is a system header directory by default, and using -I
would turn it into non-system header, leading to confusing behavior, particularly with system headers that are not entirely aligned with language standards. (GCC gives system headers more latitude and suppresses warnings, for example.)
If you use -isystem /usr/include
, then /usr/include
moves to the front of the search list. However, you will likely have to move the other default search path entries as well, to avoid breaking too many things. gcc -v
will print the entire search path.
But please don't use-isystem /usr/include
. The system headers are searched in a very specific order, and changing that order will break things.
– Marc Glisse
Nov 22 at 21:34
Good point, it will likely be necessary to move the other default search paths as well.
– Florian Weimer
Nov 22 at 21:38
-isystem
wouldn't be able to overrideCPATH
anyway since it has lower precedence thanCPATH
(which effectively is equivalent to-I
).
– vega8
Nov 23 at 14:56
-nostdinc
could help, though that's going to be a fragile hack.
– Marc Glisse
Nov 24 at 22:25
add a comment |
GCC ignores -I/usr/include
because it is a system header directory by default, and using -I
would turn it into non-system header, leading to confusing behavior, particularly with system headers that are not entirely aligned with language standards. (GCC gives system headers more latitude and suppresses warnings, for example.)
If you use -isystem /usr/include
, then /usr/include
moves to the front of the search list. However, you will likely have to move the other default search path entries as well, to avoid breaking too many things. gcc -v
will print the entire search path.
But please don't use-isystem /usr/include
. The system headers are searched in a very specific order, and changing that order will break things.
– Marc Glisse
Nov 22 at 21:34
Good point, it will likely be necessary to move the other default search paths as well.
– Florian Weimer
Nov 22 at 21:38
-isystem
wouldn't be able to overrideCPATH
anyway since it has lower precedence thanCPATH
(which effectively is equivalent to-I
).
– vega8
Nov 23 at 14:56
-nostdinc
could help, though that's going to be a fragile hack.
– Marc Glisse
Nov 24 at 22:25
add a comment |
GCC ignores -I/usr/include
because it is a system header directory by default, and using -I
would turn it into non-system header, leading to confusing behavior, particularly with system headers that are not entirely aligned with language standards. (GCC gives system headers more latitude and suppresses warnings, for example.)
If you use -isystem /usr/include
, then /usr/include
moves to the front of the search list. However, you will likely have to move the other default search path entries as well, to avoid breaking too many things. gcc -v
will print the entire search path.
GCC ignores -I/usr/include
because it is a system header directory by default, and using -I
would turn it into non-system header, leading to confusing behavior, particularly with system headers that are not entirely aligned with language standards. (GCC gives system headers more latitude and suppresses warnings, for example.)
If you use -isystem /usr/include
, then /usr/include
moves to the front of the search list. However, you will likely have to move the other default search path entries as well, to avoid breaking too many things. gcc -v
will print the entire search path.
edited Nov 22 at 21:39
answered Nov 22 at 20:55
Florian Weimer
14.5k2943
14.5k2943
But please don't use-isystem /usr/include
. The system headers are searched in a very specific order, and changing that order will break things.
– Marc Glisse
Nov 22 at 21:34
Good point, it will likely be necessary to move the other default search paths as well.
– Florian Weimer
Nov 22 at 21:38
-isystem
wouldn't be able to overrideCPATH
anyway since it has lower precedence thanCPATH
(which effectively is equivalent to-I
).
– vega8
Nov 23 at 14:56
-nostdinc
could help, though that's going to be a fragile hack.
– Marc Glisse
Nov 24 at 22:25
add a comment |
But please don't use-isystem /usr/include
. The system headers are searched in a very specific order, and changing that order will break things.
– Marc Glisse
Nov 22 at 21:34
Good point, it will likely be necessary to move the other default search paths as well.
– Florian Weimer
Nov 22 at 21:38
-isystem
wouldn't be able to overrideCPATH
anyway since it has lower precedence thanCPATH
(which effectively is equivalent to-I
).
– vega8
Nov 23 at 14:56
-nostdinc
could help, though that's going to be a fragile hack.
– Marc Glisse
Nov 24 at 22:25
But please don't use
-isystem /usr/include
. The system headers are searched in a very specific order, and changing that order will break things.– Marc Glisse
Nov 22 at 21:34
But please don't use
-isystem /usr/include
. The system headers are searched in a very specific order, and changing that order will break things.– Marc Glisse
Nov 22 at 21:34
Good point, it will likely be necessary to move the other default search paths as well.
– Florian Weimer
Nov 22 at 21:38
Good point, it will likely be necessary to move the other default search paths as well.
– Florian Weimer
Nov 22 at 21:38
-isystem
wouldn't be able to override CPATH
anyway since it has lower precedence than CPATH
(which effectively is equivalent to -I
).– vega8
Nov 23 at 14:56
-isystem
wouldn't be able to override CPATH
anyway since it has lower precedence than CPATH
(which effectively is equivalent to -I
).– vega8
Nov 23 at 14:56
-nostdinc
could help, though that's going to be a fragile hack.– Marc Glisse
Nov 24 at 22:25
-nostdinc
could help, though that's going to be a fragile hack.– Marc Glisse
Nov 24 at 22:25
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53437754%2fwhy-cant-i-explicitly-i-usr-include%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
1
Create a new directory, symlink the files you want there, and point -I at that new directory. This avoids side effects that you do not control.
– Marc Glisse
Nov 22 at 21:36