运行时链接的模型依赖目标

时间:2019-04-28 06:36:29

标签: c++ c cmake

假设我有两个CMake目标myexemylib,其中mylibSHARED

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

如何在CMake中建模?

2 个答案:

答案 0 :(得分:3)

使用简单的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)

答案 1 :(得分:0)

您确实提到了dlopen,所以我假设您在Linux上运行代码,无需使用__declspec(dllexport)导出dll函数,并且不需要静态导出库。

所以我认为您正在使用target_link_libraries做正确的事。

如您在此link中所看到的,涵盖Windows和Linux的完整cmakelists.txt文件为:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>2.3.1</version>
            <configuration>
                <source>1.6</source>
                <target>1.6</target>
            </configuration>
        </plugin>
    </plugins>
</build>

因此,对于直接动态链接而言确实如此。在Linux上,您可以使用ldd检查可执行文件的依赖项,以确保您的程序引用了该库。

但是,如果您使用dlopen(),则您已经在指定dll路径并动态加载它。这意味着,您在构建程序时不需要使用target_link_libraries()。

在两种情况下,直接链接或dlopen(),您都可能需要更新LD_LIBRARY_PATH env变量。