Я пытаюсь собрать 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)
Как я сказал сверху, я вижу здесь "уже определенные" ошибки таким образом, что для меня это не имеет смысла.