我想将最初写在Mac llvm上的一些C++代码移植到Windows Cygwin gcc。在这个项目中,我静态链接有两个库的exe文件(我使用cmake):C++库交叉依赖关系 - 从llvm移植到gcc
add_executable(myexe main.cc)
target_link_libraries(myexe lib1 lib2)
在lib1
还有一类,即声明了一个虚拟方法:
lib1/Class1.h:
class Class1
{
public:
void method1();
virtual void method2();
};
lib1/Class1.cpp:
#include "Class1.h"
void Class1::method1() {
// do work
}
// Note that method2 is not defined!
不从lib1
调用,所以这工作正常。
Class1::method2
在lib2
定义:
lib2/Class2.h:
#include "Class1.h"
class Class2
{
private:
Class1 c1;
public:
void call_c1();
};
in lib2/Class2.cpp:
#include "Class2.h"
void Class1::method2() {
// do some other work
}
void Class2::call_c1() {
c1.method2();
}
所有这一切,当我编译和在MacOS下LLVM链接它工作得很好。当我尝试在Windows/Cygwin上使用gcc进行编译时,遇到各种链接器错误,如undefined reference to vtable
或undefined reference to 'Class1:method2'
。实际的错误取决于在target_link_libraries
调用库的顺序。
是否有任何命令行选项可以传递给gcc/cmake以使其工作?或者,最好在Windows上考虑另一个工具链?我现在实际上在两个平台上都使用IntelliJ CLion。
在此先感谢您的帮助。
你举的例子正常工作在我的cygwin的安装,无论是你的CMake的文件是错误的或你的例子并不恰当代表你的榜样。 请检查您在机器上发布的示例。也发布你的cmake文件。提到你的g ++版本可能会有所帮助。 – tejas
我不知道vtbl在哪个编译单元中发出,但clang和gcc之间可能会有所不同。也许海湾合作委员会创造了一种情况,两个库依赖于对方。链接(至少与GNU ld)是一个从左到右的顺序,所以你必须在提供依赖库之前放置依赖库,并且如果链接lib2引入了一个库,你可能必须多次指定libs,比如'-llib1 -llib2 -llib1' lib1的新依赖。 –
@ roland-w,非常感谢您的评论。你建议在cmake的'target_link_libraries()'中多次指定libs已经解决了这个问题。如果您将评论转换为答案,我会将其标记为正确。 –