有没有办法告诉g ++编译器,而不是在某个-I路径中寻找include标头?

时间:2019-08-27 10:42:26

标签: c++ gcc g++

我正在尝试编译一个cpp文件,该文件使用来自2个文件夹位置的包含标头。这两个文件夹都有很多我的文件必需的标题。

现在,两个文件夹中都存在一个头文件,但是问题是它们的版本不同。因此,该通用标头中的函数具有相同的名称,但具有不同的API签名。

类似这样的东西:

文件夹A:

  • foo.hpp
  • bar1.hpp
  • bar2.hpp
  • bar3.hpp

文件夹B:

  • foo.hpp
  • bar4.hpp
  • bar5.hpp
  • bar6.hpp
文件夹A的foo.hpp中的foobar函数的

API: void foobar(arg1, arg2);

文件夹B的foo.hpp中的foobar函数的API: void foobar(arg1, arg2, arg3);

#include "foo.hpp"
#include "bar1.hpp"
...
#include "bar4.hpp"
...
...

int main(){
...
foobar (arg1, arg2);
...
}

g++ main.cpp -o MyExe -I< path-to-folder-A > -I< path-to-folder-B >

对于标头中的各种功能,这会引发诸如多个功能重新定义没有匹配的函数调用等错误。

所以,我的问题是:是否有任何标志告诉编译器仅考虑从文件夹A找到的定义而忽略从文件夹B找到的定义?

有关代码限制的注意事项:我无法以任何方式更改A和B的文件夹或文件。我也不能给标头提供绝对路径,而不是-I。

2 个答案:

答案 0 :(得分:0)

假设您可以给出更详细的相对路径:

如果文件夹b是main.cpp的子文件夹,则可以使用

#include "<relative-path-to-folder-b>/foo.hpp"

如果文件夹b不是子文件夹,则可以添加另一个-I指令,然后添加另一个-I指令:

g++ main.cpp -o MyExe -I<path-to-folder-before-b> -I< path-to-folder-A > -I< path-to-folder-B >

然后添加包含

#include "b/foo.hpp"

答案 1 :(得分:-1)

一种解决此问题的方法(非常脆弱,容易破解,并且编译速度可能很慢)依赖于手册中的警卫(#ifndef MY_HEADER等),这些警卫大概存在于相关标头中:

  1. 收集所有要使用的头文件(不包括所有不需要的头文件)。

  2. 创建一个集中包含文件,#include foo.hpp所有这些文件(通过绝对路径,即确保该路径选择了上面收集的正确$.contextMenu({ selector: '.gridRelatorioCursorMorada', build: function ($triggerElement, e) { var coords = $triggerElement[0].attributes['data-coord'].nodeValue; var coordsArray = coords.split(','); return { callback: function (key) { if (key === 'get') { getdata(); } }, items: { get: { name: "Get data" }, see: { name: "See data", items: { normal: { name: coords }, graus: { name: dd2dms(coordsArray[0], coordsArray[1]) }, siresp: { name: decimalToSIRESPCoordinates(coordsArray[0], coordsArray[1]) } } } } }; } }); ,而不是一个) “原始”的。)

  3. 告诉您的编译器强制包含此中央包含文件。实际上,您应该将其设置为预编译的标头(或将其包含在您的标头中)。

  4. 由于在每个转换单元的开头强制包含所有这些标头,因此在您到达要包含的“错误”标头之前,已经设置了所有包含保护定义。编译器仍将它们复制粘贴到该位置,但是包含保护将阻止考虑其中的任何代码。