模型依赖关系目标,在运行时链接

Model dependency target which link at runtime

本文关键字:运行时 链接 目标 依赖 关系 模型      更新时间:2023-10-16

>假设我有两个CMake目标,myexemylib,其中mylib SHARED

我在运行时从myexe加载mylib(使用 dlopen(。所以我的要求是,当我构建myexe时,mylib也会被构建。据我了解,target_link_libraries()在这里并不准确,因为链接仅在运行时进行。

如何在 CMake 中对此进行建模?

使用简单的add_dependencies使一个目标自动构建另一个目标:

# The library used via dlopen should be built with MODULE type.
add_library(mylib MODULE <mylib-source-files>)
add_executable(myexe <myexe-source-files>)
# For build myexe, mylib should also be built.
add_dependencies(myexe mylib)

你确实提到了 dlopen,所以我假设你在 Linux 上运行你的代码,你不需要用 __declspec (dllexport( 导出 dll 函数,也不需要静态导出库。

所以我认为你用target_link_libraries做对了。

正如你在这个链接中看到的,à完整的cmakelists.txt涵盖Windows和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((,您可能需要更新LD_LIBRARY_PATH env 变量。