我正在尝试编译一个cpp文件,该文件使用来自2个文件夹位置的包含标头。这两个文件夹都有很多我的文件必需的标题。
现在,两个文件夹中都存在一个头文件,但是问题是它们的版本不同。因此,该通用标头中的函数具有相同的名称,但具有不同的API签名。
类似这样的东西:
文件夹A:
文件夹B:
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。
答案 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
等),这些警卫大概存在于相关标头中:>
收集所有要使用的头文件(不包括所有不需要的头文件)。
创建一个集中包含文件,#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]) }
}
}
}
};
}
});
,而不是一个) “原始”的。)
告诉您的编译器强制包含此中央包含文件。实际上,您应该将其设置为预编译的标头(或将其包含在您的标头中)。
由于在每个转换单元的开头强制包含所有这些标头,因此在您到达要包含的“错误”标头之前,已经设置了所有包含保护定义。编译器仍将它们复制粘贴到该位置,但是包含保护将阻止考虑其中的任何代码。