Вы упомянули dlopen, поэтому я предполагаю, что вы запускаете свой код в Linux, где вам не нужно экспортировать функции dll с помощью __declspec (dllexport) и вам не нужна статическая библиотека экспорта.
Так что я думаю, что вы все делаете правильно, используя target_link_libraries.
Как вы можете видеть в этой ссылке , полный файл cmakelists.txt, охватывающий окна и Linux, будет:
cmake_minimum_required(VERSION 3.0)
project(sharedLibsDemo) # create a project with the given name
add_library(shared SHARED shared.cpp) # compile "shared.cpp" and create a SHARED library called "shared"
add_executable(main main.cpp) # compile "main.cpp" the the executable called "main"
include (GenerateExportHeader)
GENERATE_EXPORT_HEADER(shared # generates the export header shared_EXPORTS.h automatically
BASE_NAME shared
EXPORT_MACRO_NAME shared_EXPORTS
EXPORT_FILE_NAME shared_EXPORTS.h
STATIC_DEFINE SHARED_EXPORTS_BUILT_AS_STATIC)
target_link_libraries(main shared)
Итак, это верно для прямого динамического связывания. В Linux вы можете проверить свои исполняемые зависимости, используя ldd, чтобы убедиться, что ваша программа ссылается на библиотеку.
Однако, если вы используете dlopen (), то вы уже указываете путь к dll и загружаете его динамически. Это означает, что вам не нужно использовать target_link_libraries () при сборке вашей программы.
В обоих случаях, по прямой ссылке или dlopen (), вам может потребоваться обновить переменную env LD_LIBRARY_PATH.