我有一個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
行,結果相同。
某些代碼('CMakeLists.txt')會更好地表達您的問題。 – Tsyvarev
@Tsyvarev我盡我所能發佈了我正在使用的CMakeLists.txt文件的簡化版本 – borrrden