模型依赖关系目标,在运行时链接
Model dependency target which link at runtime
>假设我有两个CMake目标,myexe
和mylib
,其中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 变量。
相关文章:
- C++ 运行时链接器错误 (liblog4cpp.so.5) Eclipse
- 为什么每当我尝试运行此链接列表删除功能时都会收到分段错误错误?
- 生成文件无法在运行时链接库
- 引用构造函数时链接失败
- 运行时链接到不在LD_LIBRARY_PATH上的动态库
- 模型依赖关系目标,在运行时链接
- 根据用户配置在运行时链接共享对象
- CG 运行时链接器错误与 cmake 项目 (g++)
- 如何在运行时链接期间从我的 DLL 调用函数
- 格鲁运行时/链接器错误
- 在安卓上与 SDL_Mixer 和 SMPEG2 的运行时链接错误
- NDK使用STL时发生运行时链接错误
- 如何通知调试器运行时链接的 DLL 文件的位置
- 将现有的C++dll与Windows Phone组件运行时链接
- 选择要在运行时链接的库
- Boost库构建-运行时链接和链接选项之间的差异
- 更改运行时库选项对运行时链接的影响
- 在运行时链接c++ .o文件
- 在运行时链接c++对象
- 共享库和可执行文件与 Linux 上的静态 C 运行时链接.它们中的每一个都有像Windows这样的独立堆吗?