2016-11-14 44 views
1

我有一個CMake安裝程序,將4個靜態庫和1個共享庫鏈接到頂層共享庫(我們稱之爲Top.dll)。除了一件事外,這將工作正常。我有一個模塊定義文件,表示哪些符號應該公開。 Top.dll的構建和迄今爲止非常好。爲什麼在Windows上使用CMake構建時會出現重複的符號鏈接器錯誤?

現在,當我嘗試通過CMake鏈接一個可執行文件與Top.dll時,我得到了每個公共符號的鏈接器錯誤,聲稱它是在兩個地方定義的(Top.dll和實際定義的靜態庫) Top.dll不包含其自己的原始定義。如果我按預期刪除靜態庫,則會得到未解決的符號錯誤。如果我刪除模塊定義文件,我會得到相同的結果。它好像是有零次或兩次。我在這裏錯過了一些設置嗎?我不認爲我在非基本方式使用CMake的...

UPDATE的解釋通過CMake的

# setup the lib 
add_subdirectory(vendor/A) #shared library 
add_subdirectory(vendor/B) #static library 
add_subdirectory(vendor/C) #static library 
add_library(Top SHARED ${ALL_SRC_FILES}) 
target_link_libraries(Top A B C) 
set_target_properties(Top PROPERTIES LINK_FLAGS 
      "/def:${PROJECT_SOURCE_DIR}/definitions.def") #contains symbols from B 

add_subdirectory(C/Tests) 

# CMakeLists.txt from C/Tests 

add_executable(Tests ${SRC_FILES}) 
target_link_libraries(Tests Top) 

上述簡化,但我會得到像下面這樣的錯誤在該C /測試項目編譯點:

B.lib(xxx.obj) : error LNK2005: _ABC already defined in Top.lib(Top.dll) 

如果我從target_link_libraries呼叫中除掉B.LIB,然後按預期我得到解析的符號。如果我刪除/def行,結果相同。

+0

某些代碼('CMakeLists.txt')會更好地表達您的問題。 – Tsyvarev

+0

@Tsyvarev我盡我所能發佈了我正在使用的CMakeLists.txt文件的簡化版本 – borrrden

回答

1

我已經能夠解決這個問題了,將B和C的target_link_libraries設置爲private。這可能是也可能不是正確的解決方案,我會等待其他答案。如果我不這樣做,看起來依賴被執行到最終的可執行文件(所以它鏈接到Top.dll和B.lib等)。

相關問題