-编译时,I和-I系统的行为不同 我有3个CMAPK项目:MyAPP AVR可执行文件,用于UNIX的MyAPP UNIX可执行文件,MyLyb是由可执行文件导入的C++静态库。当我编译MyLib项目时,我一点问题都没有。我还可以成功编译myapp avr和myapp unix项目。但是,我在链接我的应用程序avr时出错,例如未定义的引用

-编译时,I和-I系统的行为不同 我有3个CMAPK项目:MyAPP AVR可执行文件,用于UNIX的MyAPP UNIX可执行文件,MyLyb是由可执行文件导入的C++静态库。当我编译MyLib项目时,我一点问题都没有。我还可以成功编译myapp avr和myapp unix项目。但是,我在链接我的应用程序avr时出错,例如未定义的引用,c++,cmake,avr,C++,Cmake,Avr,我将一个示例上载到GitHub:。我的CMake结构基于Pablo Ariasal示例项目: 我现在知道问题与-isystem选项有关。同一个确切的命令怎么可能与-I选项一起工作,而与用于导入/供应商库的-isystem选项不一起工作 不工作:由CMake自动生成 /usr/local/CrossPack AVR/bin/AVR-g++-DARDUINO=10805-DF_CPU=1600000l-isystem mylib/include-Os-g-w-fpremissive-fno异常-ff

我将一个示例上载到GitHub:。我的CMake结构基于Pablo Ariasal示例项目:

我现在知道问题与-isystem选项有关。同一个确切的命令怎么可能与-I选项一起工作,而与用于导入/供应商库的-isystem选项不一起工作

不工作:由CMake自动生成

/usr/local/CrossPack AVR/bin/AVR-g++-DARDUINO=10805-DF_CPU=1600000l-isystem mylib/include-Os-g-w-fpremissive-fno异常-ffunction节-fdata节-fno线程安全静态-MMD-flto-mmcu=atmega328p-std=gnu++11-o src/main.cpp.obj-c src/main.cpp

作品:

/usr/local/CrossPack AVR/bin/AVR-g++-DARDUINO=10805-DF_CPU=1600000l-I mylib/include-Os-g-w-fpremissive-fno异常-ffunction节-fdata节-fno线程安全静态-MMD-flto-mmcu=atmega328p-std=gnu++11-o src/main.cpp.obj-c src/main.cpp

根据avr-g++手册,-isystem的意思是:在所有由-I指定的目录之后,但在标准系统目录之前,搜索dir以查找头文件。将其标记为系统目录,以便它得到与应用于标准系统目录相同的特殊处理

此外,在阅读关于-I选项的文章时,avr-g++说:您不应该使用此选项添加包含供应商提供的系统头文件的目录,而应该使用-isystem

我想这就是为什么CMake会自动使用-isystem选项而不是使用-I生成Make文件的原因。因为在我的CMake配置中,我使用find_package命令链接库,CMake会将其解释为供应商提供的系统

这个项目与同样使用-isystem的clang配合得很好。我的问题是avr-g++


以前有人在使用avr-g++的-isystem时遇到过问题吗?是否有可能强制CMake使用-I??谢谢

问题解决了!显然,isystem在GNU编译器上有不同的行为,根据:

在非常旧的系统上,一些预定义的系统头目录 得到更特殊的待遇。GNU C++考虑头中的代码 在那些被外部C块包围的目录中找到

这些人也有类似的问题:

因此,为了避免这种混乱,只需通知CMake使用-I即可。需要一条简单的线路:没有从上导入的系统

例如:

set_target_properties(my_target
    PROPERTIES
    NO_SYSTEM_FROM_IMPORTED ON
    )

在myapp avr可执行文件的CMakeLists.txt中可以找到完整的示例:。

我不太确定您的问题是什么。-I和-is系统做不同的事情。所以他们做的事情是不同的。相关的但是不同。大多数第三方库都应该使用-I来完成,除了我现在看到的少数假装是另一种类型的库,Boost。也许你在一个extern C块中包含了一次头文件,然后又在这个块之外包含了一次头文件。如果没有答案,很难判断你做错了什么。确保不在extern C块中包含标题,并在标题顶部放置pragma一次,以确保只包含一次。感谢您的回答。为了更好地解释我的问题,我更新了我的问题。啊!别忘了搜索——这个系统被引号包围着,否则谷歌会忽略它;这是精确解。伙计,这项功能太隐蔽了,简直是个漏洞。