假设我有两个CMake目标myexe
和mylib
,其中mylib
是SHARED
。
我正在运行时从mylib
加载myexe
(使用dlopen
)。所以我的要求是,当我构建myexe
时,mylib
也将被构建。据我了解,target_link_libraries()
在这里并不准确,因为链接仅在运行时进行。
如何在CMake中建模?
答案 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变量。