Как исправить несколько определений (LNK2005) с флагом ссылки / wholearchive в VS 2017 - PullRequest
0 голосов
/ 25 марта 2019

Я пытаюсь собрать DLL из нескольких .libs (мы хотели бы распространять и устанавливать только один файл, а сторонний код, Labview, который будет использовать нашу библиотеку, будет загружать только .dll а не .lib). Код связывается и запускается в примере программы, когда мы собираем каждый из наших подпроектов в один .lib и связываем их в .exe. Я пытаюсь объединить все наши подпроекты плюс log4cplus и пару библиотек наддува в один .dll.

Я пытался настроить флаги компоновщика для проекта в Visual Studio (2017, 15.9.9), и Labview всегда жалуется, что отсутствует dll буста потока. Мой файл cmake верхнего уровня имеет значение CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS. Я пытался настроить зависимости библиотек ссылок, использовать входы зависимостей библиотек и т. Д. В Visual Studio. Неудачно. Поэтому я попробовал большой молот: / WHOLEARCHIVE . Что похоже на билет.

Кроме того, что он дает мне непонятные сообщения об ошибках. Как

frontend_producer_c.lib(frontend_manager_c.obj) : error LNK2005: 
               run_ui_manager already defined in frontend_manager_c.obj

frontend_manager_c.cpp находится на вершине пищевой цепи. Таким образом, ничто иное не включает это или тянет в frontend_manager_c.obj Все же все его экспортированные символы приводят к вышеуказанной ошибке. Я не понимаю, почему компоновщик пытается повторно импортировать символы из одного и того же .obj.

Теперь подробности о том, как я настроил проект:

Вот что VS показывает в командной строке в свойствах компоновщика:

/OUT:"C:\Users\Me\checkout\dtu\build\util\Debug\libclnt-dtu-libutil.dll" 
/MANIFEST /NXCOMPAT 
/PDB:"C:/Users/Me/checkout/dtu/build/util/Debug/libclnt-dtu-libutil.pdb" 
/DYNAMICBASE 
"boost_thread-vc140-mt.lib" "boost_filesystem-vc140-mt.lib" "log4cplusSD.lib" 
"clnt2000_param_info.lib" "dtutime.lib" "event.lib" "helpers.lib" "process.lib" 
"producer.lib" "frontend_producer.lib" "frontend_producer_c.lib" "kernel32.lib" 
"user32.lib" "gdi32.lib" "winspool.lib" "shell32.lib" "ole32.lib" "oleaut32.lib" 
"uuid.lib" "comdlg32.lib" "advapi32.lib" 
/DEF:"C:/Users/Me/checkout/dtu/build/util/util_dll.dir/Debug/exports.def" 
/IMPLIB:"C:/Users/Me/checkout/dtu/build/util/Debug/libutil.lib" 
/DEBUG /DLL /MACHINE:X64 /INCREMENTAL 
/PGD:"C:\Users\Me\checkout\dtu\build\util\Debug\libclnt-dtu-libutil.pgd" 
/SUBSYSTEM:CONSOLE /MANIFESTUAC:"level='asInvoker' uiAccess='false'" 
/ManifestFile:"util_dll.dir\Debug\libclnt-dtu-libutil.dll.intermediate.manifest" 
/ERRORREPORT:PROMPT /NOLOGO /LIBPATH:"C:/Users/Me/checkout/dtu/lib" 
/LIBPATH:"C:/Users/Me/checkout/dtu/lib/Debug" 
/LIBPATH:"C:/Users/Me/checkout/log4cplus/build/src" 
/LIBPATH:"C:/Users/Me/checkout/log4cplus/build/src/Debug" 
/LIBPATH:"C:/Users/Me/vcpkg/installed/x64-windows/lib" 
/LIBPATH:"C:/Users/Me/vcpkg/installed/x64-windows/lib/Debug" /TLBID:1 

И вот что он показывает для дополнительных опций:

%(AdditionalOptions) /machine:x64 /wholearchive

Файл CMake сводится к:

project(util)
set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS true)

set(CMAKE_TOOLCHAIN_FILE="\"C:/Users/Me/vcpkg/scripts/buildsystems/vcpkg.cmake\"")
include_directories("${CMAKE_SOURCE_DIR}/include")
include_directories("C:/Users/Me/vcpkg/installed/x64-windows/include")
include_directories("C:/Users/Me/checkout/log4cplus/include")
link_directories("${CMAKE_SOURCE_DIR}/lib")
link_directories("C:/Users/Me/checkout/log4cplus/build/lib")
link_directories("C:/Users/Me/vcpkg/installed/x64-windows/lib")

add_subdirectory(src/time)
. . .
add_subdirectory(src/frontend_ui_c_api)

add_library(util_dll SHARED $<TARGET_OBJECTS:frontend_producer_c>)

add_dependencies(util_dll dtutime event helpers process clnt2000_param_info 
                 producer frontend_producer frontend_producer_c)
target_link_libraries(util_dll dtutime event helpers process 
                      clnt2000_param_info producer frontend_producer 
                      frontend_producer_c boost-thread-lib 
                      boost-filesystem-lib log4cplus)

Как я сказал сверху, я вижу здесь "уже определенные" ошибки таким образом, что для меня это не имеет смысла.

...