Why can't I explicitly `-I /usr/include`?












1














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).










share|improve this question


















  • 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














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).










share|improve this question


















  • 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








1







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).










share|improve this question













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






share|improve this question













share|improve this question











share|improve this question




share|improve this question










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














  • 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












1 Answer
1






active

oldest

votes


















1














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.






share|improve this answer























  • 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 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











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
});


}
});














draft saved

draft discarded


















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









1














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.






share|improve this answer























  • 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 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
















1














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.






share|improve this answer























  • 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 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














1












1








1






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.






share|improve this answer














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.







share|improve this answer














share|improve this answer



share|improve this answer








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 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


















  • 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 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
















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


















draft saved

draft discarded




















































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.




draft saved


draft discarded














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





















































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







Popular posts from this blog

A CLEAN and SIMPLE way to add appendices to Table of Contents and bookmarks

Calculate evaluation metrics using cross_val_predict sklearn

Insert data from modal to MySQL (multiple modal on website)