XE3 是bug还是破解后遗症?

HKCID 2013-03-02 11:00:54

刚装XE3 不久,把以前的项目无错的项目编译一下,发现XE3竟然忽略的头文件的类的内联函数.

例如:
//头文件 AAAA.h

namespace TESTINLIN{
class AAAA
{
public:
void test();
};

inline void AAAA::test (){
int tst =555;
tst +=1;
}
}

//Main.cpp文件
include "AAAA.h"
WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int)
{
TESTINLIN::AAAA lew;
lew.test();
}

当然如果你把简单的项目编译的话没有错,但我的是 AAAA.Cpp、BBBB.cpp、 XXXX.cpp 等相互引用头文件。

如果上面的在XXXX.cpp 的某个函数用到AAAA实例的内联函数,例如:
void xxxx::app(){
TESTINLIN::AAAA lew;
lew.test();
}
编译XXXX.cpp没错,但链接的时候就会出现Error: Unresolved external 'AAAA::test()'...from XXXX.OBJ;

如果把AAAA.h头文件 inline void AAAA::test (){...} 的 inline去掉,链接就没有错误,

不然你在inline void AAAA::test(){...}的函数里加入任意的非法字符(或放一遍文章进去),但编译

AAAA.cpp 和 AAAA.h 却通过, 那说明XE3根本就不编译AAAA.h头文件 的内联函数 inline void

AAAA::test (){...}, 把它忽略掉,所以链接的时候就

出现 Error: Unresolved external 'AAAA::test()'...from 。

//=====================================================

这是为什么? 真的搞不明白,后来把XE3的项目的文件放到BCB6.0 里编译链接,没有错。

我又把BCB6.0 里无错的项目给XE3编译,还是链接出现Unresolved external 'AAAA::test()' 这样的链接问题。

总之所有的引用的内联函数都出现这个链接问题。

谁知道是什么原因,帮帮忙啊

...全文
294 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
wg961423 2013-03-25
  • 打赏
  • 举报
回复
越来越严格了?
HKCID 2013-03-06
  • 打赏
  • 举报
回复
引用 8 楼 PPower 的回复:
头文件相至包含交叉连接,是大忌。 A.h #include "b.h" class classA{ void fun( classB b) ; }; B.h #include "A.h" class classB{ void fun(classA a); }; 类似的这种代码。。。。最容易引起问题。 此时一般使用指针及声明的方式来……
对 对 ! 确实有这样的做法, 我是把是把一个著名的库部分代码插到项目里, 人家库代码确实有这个做法 , 我为了方便把这申明都删除了,引入了头文件,应该是这样问题了。 但我就奇怪,怎么在低版本的BCB6.0 确好不费力通过。BCB 高版本越来越怎么啦?
HKCID 2013-03-06
  • 打赏
  • 举报
回复
引用 7 楼 sololie 的回复:
咱cb版里全是这种跟c\c++没太多关系的问题,饭馆其他的c\c++板块人家都在讨论纯技术问题。 玩cb精力全耗在无意义的地方去了。 大家都去用tc或vs吧,cb让人恨得牙痒痒。
亮仔! 踢ccrun的馆你? cb怎么让人恨得牙痒痒了?
勉励前行 2013-03-05
  • 打赏
  • 举报
回复
A.h中没有//#include "b.h",但在A.cpp中可以引入,这样就是经典的避免交叉引用的解决方法。
勉励前行 2013-03-05
  • 打赏
  • 举报
回复
头文件相至包含交叉连接,是大忌。 A.h #include "b.h" class classA{ void fun( classB b) ; }; B.h #include "A.h" class classB{ void fun(classA a); }; 类似的这种代码。。。。最容易引起问题。 此时一般使用指针及声明的方式来解决。 A.h //#include "b.h" class classB ;//作个声明,避免include "b.h" class classA{ void fun( classB *b) ; }; 这样头文件中就无须引入多余的其他头文件,编译速度可加快,也减少编译器出错机会 如果头文件交叉引用,那么交叉引用的单元一定要在同一个Dll或BPL或EXE项目中不能分割。否则会有链接问题。
sololie 2013-03-05
  • 打赏
  • 举报
回复
咱cb版里全是这种跟c\c++没太多关系的问题,饭馆其他的c\c++板块人家都在讨论纯技术问题。 玩cb精力全耗在无意义的地方去了。 大家都去用tc或vs吧,cb让人恨得牙痒痒。
HKCID 2013-03-05
  • 打赏
  • 举报
回复
引用 4 楼 PPower 的回复:
我用win64試,没发现问题。 ……
不是单个文件编译, 我是很多文件编译, 编译是没错.是链接有错误.
引用 5 楼 dataxdata 的回复:
把类的名称AAAA随便换个别的名字,如果仍能编译通过,就说明应该是头文件的问题,而不是类的问题,比如,在头文件最前面一般都有 #if !defined(XXXXX_H) #define XXXXX_H 这样的代码,是不是这里的定义重复了?
每个头文件都有类似的定义,故意改错测试结果 改了类名AAAA: 发现错误 inline void AAAA::test (){...}改inline void AAAAwsdfs::test (){...} : 发现错误。 inline void AAAA::test(){...}改 inline void AAAA::testsdfsf(){...} : 发现错误。 inline void AAAA::test(){...}改 inline void AAAA::test(){...safass乱七八糟doukey }: 编译通过。 --------------- 为什么在BCB6.0 一切正常, 可能像PPower 大侠所说的, 头文件受其它的影响,XE3是刚装的,不过在前面为了编译个工程,有添加了一些环境变量,不过很多环境变量我都删除了,还是这样的结果。 看来要整理一下头文件,一个一个文件来添加进工程,看看那里出错了。
HKCID 2013-03-04
  • 打赏
  • 举报
回复
谢谢2位提示,刚刚回来试了一下.
引用 1 楼 PPower 的回复:
怀疑有可能是重名的文件AAAA.h AAAA.cpp或者以前编译的 AAAA.obj在路径中导致链接了错误的obj文件
没有重名的文件,编译的后AAAA.obj 也会覆盖原来的。
引用 2 楼 dataxdata 的回复:
把内联函数直接写在类的声明里试试?
刚才试了,也是一样的结果,也被忽略掉了,在函数体随便打什么都可以编译通过的,真想不明白。
dataxdata 2013-03-04
  • 打赏
  • 举报
回复
把类的名称AAAA随便换个别的名字,如果仍能编译通过,就说明应该是头文件的问题,而不是类的问题,比如,在头文件最前面一般都有 #if !defined(XXXXX_H) #define XXXXX_H 这样的代码,是不是这里的定义重复了?
勉励前行 2013-03-04
  • 打赏
  • 举报
回复
我用win64試,没发现问题。 AAAA.h namespace TESTINLIN{ class AAAA { public: void test(); }; inline void AAAA::test (){ int tst =555; tst +=1; } } 将 AAAA.h AAAA.cpp 编译后得到目标文件,然后新开一个项目。不包含AAAA.cpp,只引用。 #include "AAAA.h" #pragma link "AAAA" 这样是正常链接的。此时如果修改 AAAA.h 中的函数,编译器也是能发现错误的。 你那可能是因为头文件交叉引用而导致的问题。如果头文件交叉引用,会导致编译时间过长或编译失败,最好将交叉引用去掉。去掉交叉引用的方法很多。但我依然认为你的问题是文件重名的可能性较大。
dataxdata 2013-03-03
  • 打赏
  • 举报
回复
把内联函数直接写在类的声明里试试?
勉励前行 2013-03-03
  • 打赏
  • 举报
回复
怀疑有可能是重名的文件AAAA.h AAAA.cpp或者以前编译的 AAAA.obj在路径中导致链接了错误的obj文件

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧