我想將最初寫在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已經解決了這個問題。如果您將評論轉換爲答案,我會將其標記爲正確。 –